从估计的 PDF 中查找 CDF(由 KDE 估计)

机器算法验证 Python 密度函数 内核平滑 累积分布函数 密度估计
2022-04-07 23:08:12

我想从估计的 PDF 中找到 CDF。该 PDF 是根据核密度估计(使用 0.6 宽度窗口的高斯核)估计的。

我知道,理论上,CDF 可以估计为: FX(x)=xf(t)dt

是否可以将这个积分直接应用于估计的 pdf在这种情况下,我使用的是 python。

提前致谢。

1个回答

如果您知道内核本身的 cdf,则无需集成任何东西。我相信这对于所有常见的内核来说都是直截了当的。

注意

  1. A KDE 是混合密度

  2. 混合物的cdf是 cdf 的混合物。

也就是说,如果f^(x)=1nifi(x)你的 KDE 在x, 然后 F^(x)=1niFi(x).

以高斯核为例。如果xi是你的观察,fi1σϕ(xxiσ)Fi=Φ(xxiσ), 通常在哪里σ被定义为带宽(在某些实现中,带宽可能是σ)。

事实上,R 做到了(定义带宽 =σ) 对于所有内核,而不仅仅是高斯内核。但是只要您可以将带宽转换为内核的参数就很容易,这样您就可以为 cdf 调用函数。

因此,您可以随时评估混合物的 cdfx在线性时间。如果您需要它能够计算F^ 快速,您可以在网格上评估它(足够精细以获得足够的准确性),并在两者之间使用插值(例如,在 R 中,这很容易完成approxfun;毫无疑问 Python 有一种方便的方法来做类似的事情)

这是高斯核的 kde 和 cdf 图的示例。

核密度估计和相应的 cdf

这是我使用的代码(它是在 R 中完成的——这是一个快速展示这个想法的工具,一个合适的函数将是检查参数、提供更好的信息、标记轴、让你指定内核等等)。主力是第三行,它定义了对 cdf 进行所有实际计算的函数,其他一切都是数据或绘图的细节。

x <- c(11,12,16) #data
xx <- seq(7,20,.1) # plot values for the cdf
kdecdfnorm <- function(x,xdat,bw) rowMeans(pnorm(outer(x,xdat,"-"),0,bw)) #cdf of KDE
opar <- par() # save graphics parameter settings
par(mfrow=c(1,2)) # 1 x 2 plot grid
kde <- density(x)
plot(kde)
bw <- kde$bw 
plot(xx,kdecdfnorm(xx,x,bw),type="l")
abline(h=c(0,1),col=rgb(.5,.5,.5,.5),lty=3)
par(opar) # restore graphics parameters

那是如何rowMeans(pnorm(outer(x,xdat,"-"),0,bw))工作的?

  • rowMeans只是在做1ni=1n它的论点

  • pnorm正在计算高斯核项的 cdf,最后一个参数是带宽

  • 第一个论点pnormxxi在数据值上(xi) 以及我们想要找到曲线的各种 x

也就是说我们只是在计算1niΦ(xxiσ)以一种非常直接的方式,跨越任何价值观x我们想计算它。