从嘈杂的观察中恢复原始分布

机器算法验证 分布 估计
2022-04-06 12:53:14

有一组已知的对使得(yi,σi)

yi=xi+σiNi

NiN(0,1)对于所有i

xiρ对于所有i

其中是观察值,是真实值。yx

如何恢复分发这不一定是正常的。ρ

1个回答

如果是一个已知常数,那么这只是核密度估计的变体。如果它们不是常数(但至少知道一个常数),那么它将是加权核密度估计的一种形式。σi

如果未知,但被认为与相关,那么它会变得更加复杂,但您仍然应该能够使用不同的内核找到合理的估计。例如,如果更大的意味着更大的,那么给定的更有可能来自,因此非对称内核将是合适的。之间关系的卷积σixixiσiyixixiσi

对数样条密度估计背后的想法也可能适用于此。鉴于上述关系和最大似然,您可以使用该想法来估计x

还有贝叶斯方法使用狄利克雷分布的混合来表示未知密度。

编辑

下面是一些示例 R 代码,它使用核密度估计来尝试重建原始密度:

x <- rgamma(100, 3, 1/3)
e <- rnorm(100)
sig <- runif(100, 0.5, 1.5)
y <- x + sig*e

plot( density(y, kernel='gaussian', bw=1, weights=sig/sum(sig)), type='l' )

densgen <- function(y, sig) {
    n <- length(y)
    function(x) {
        sum( dnorm(x, y, sig)/n )
    }
}

tmpdens <- Vectorize(densgen(y, sig))
curve(tmpdens, from=0, to=25, add=FALSE)

curve(dgamma(x,3,1/3), add=TRUE, col='red')

您可以通过将 的值乘以sig常数来平滑密度估计,常数越大,越平滑。

这里有一些代码在假设特定分布时对参数进行最大似然拟合:

library(distr)
library(stats4)

ll <- function(shape, rate) {
    if( shape <= 0 || rate <= 0 ) return(Inf)
    X <- Gammad(shape,1/rate)
    -sum( sapply( seq_along(y), function(i) {
        E <- Norm(0,sig[i])
        Y <- X + E
        log( d(Y)(y[i]) )
    } ) ) 
}

fit <- mle( ll,  start = list( shape=3, rate=1/3 ) )

curve( dgamma(x, coef(fit)[1], coef(fit)[2]), add=TRUE, col='blue' )

如果您需要密度的非参数估计,那么您可以使用对数样条密度估计或 Dirichlets 的混合,或其他非参数估计来代替上面的参数密度。