核密度估计Kernel Density Estimation(KDE)

备:密度估计相关知识

 

密度估计经常在统计学中作为一种基于有限的样本来估计其概率密度函数的方法。

 

在研究随机变量的过程中,随机变量的概率密度函数的作用是描述随机变量的特性。但是在实际应用中,总体概率密度函数通常是未知的,那么如何来估计总体概率密度呢?一般,我们通过抽样或者采集一定的样本,可以根据统计学知识从样本集合中推断总体概率密度。这种方法统称为概率密度估计,即根据训练样本来确定随机变量的概率分布。一般概率密度估计方法方法大致分为两类:参数估计和非参数估计。

 

参数估计(Parametric Estimation)是根据对问题的经验知识,假设问题具有某种数学模型,随机变量服从某种分布,即假定概率密度函数的形式,然后通过训练数据估计出分布函数的参数。常见的参数估计方法有最大似然方法和贝叶斯方法。对于参数估计,根据样本中是否已知样本所述类别将参数估计又划分为监督参数估计和非监督参数估计监督参数估计是由已知类别的样本集对总体分布的某些参数进行统计推断。而无监督参数估计已知总体概率密度函数形式但未知样本所属的类别,要求推断出概率密度函数的某些参数,这种推断方法称之为非监督情况下的参数估计。

 

非参数估计(Nonparametric Estimation)则是在已知样本所属的类别不假定总体分布形式下,基于大样本的性质,直接利用样本估计出整个函数。在很多情况下,我们对样本的分布并没有充分的了解,无法事先给出密度函数的形式,而且有些样本分布的情况也很难用简单的函数来描述。在这种情况下,就需要用到非参数估计。但是,并不是非参数估计一定优于参数估计,因为非参数估计受训练样本影响,其完备性或者说是泛化能力不会很好;且这种估计只能用数值方法取得,无法得到完美的封闭函数图形。常用的非参数估计方法有直方图法,核概率密度估计等。

 

核密度估计

核密度估计Kernel Density Estimation(KDE)是在概率论中用来估计未知的密度函数,属于非参数检验方法之一。



 

核密度的方法就是借助一个移动的单元格(核函数)放在每一个数据点的位置上。然后将核函数的作用效果叠加起来,获得一条光滑的曲线。而核函数的选择条件为单个峰值下的函数面积为1

 

数据的标准化(normalization)是将数据按比例缩放,使之落入一个小的特定区间。数据的归一化处理,即将数据统一映射到[0,1]区间上。

核密度估计有多种内核,在很多情况下,平滑内核(如高斯核密度估计,Gaussian Kernel Density)使用场景较多。

 

核密度估计

所谓核密度估计,就是采用平滑的峰值函数(“”)来拟合观察到的数据点,从而对真实的概率分布曲线进行模拟。

核密度估计(Kernel densityestimation),是一种用于估计概率密度函数的非参数方法,


为独立同分布Fn个样本点,设其概率密度函数为f,核密度估计为以下:

//img.blog.csdn.net/20141215231909328

K(.)为核函数(非负、积分为1,符合概率密度性质,并且均值为0)。有很多种核函数,uniform,triangular,biweight, triweight, Epanechnikov,normal等。

h>0为一个平滑参数,称作带宽(bandwidth),也看到有人叫窗口。

Kh(x) = 1/hK(x/h). 为缩放核函数(scaledKernel)

核密度函数的原理比较简单,在我们知道某一事物的概率分布的情况下,如果某一个数在观察中出现了,我们可以认为这个数的概率密度很大,和这个数比较近的数的概率密度也会比较大,而那些离这个数远的数的概率密度会比较小。

基于这种想法,针对观察中的第一个数,我们可以用K去拟合我们想象中的那个远小近大概率密度。对每一个观察数拟合出的多个概率密度分布函数,取平均。如果某些数是比较重要的,则可以取加权平均。需要说明的一点是,核密度的估计并不是找到真正的分布函数。

Note: 核密度估计其实就是通过核函数(如高斯)将每个数据点的数据+带宽当作核函数的参数,得到N个核函数,再线性叠加就形成了核密度的估计函数,归一化后就是核密度概率密度函数了

 

KDE算法:索引树

sklearn算法实现中有一个参数是算法项,如algorithm='auto',想了一下是为了加速。

KDE的概率密度函数公式得到后

//img.blog.csdn.net/20141215231909328


有了上述公式之后,只需遍历输出图像的每一个点,计算其核密度估计值即可。

但是稍微想一下就发现这个程序太冗余了,如果有很多点(n很大),并且输出图像很大,那么每一个像素都需要进行n个累积的加法运算,并且大部分都是+0(因为一般来说,一个点附近的点不会很多,远远小于n,其余大部分点与这个像素的距离都大于r),这样就造成了冗余计算。

解决方案当然也非常简单,就是建立一个索引,然后在计算某个像素的核密度估计值时利用索引搜索出附近的点,然后累积这些点的核函数即可。

Dotspatial自带了多种空间索引,有R树,R*树,KD树等;sklearn自带了kd tree, ball tree等等。

如果只需找出附近的点,对索引要求不高,任意一个索引都能使用。

[空间点云核密度估计算法的实现-Dotspatial为基础GIS]

KDE带宽h

如何选定核函数的方差呢?这其实是由带宽h来决定,不同的带宽下的核函数估计结果差异很大。

除了核函数,另一个影响KDE的参数是带宽(h)。带宽反映了KDE曲线整体的平坦程度,也即观察到的数据点在KDE曲线形成过程中所占的比重。

带宽越大,观察到的数据点在最终形成的曲线形状中所占比重越小,KDE整体曲线就越平坦;带宽越小,观察到的数据点在最终形成的曲线形状中所占比重越大,KDE整体曲线就越陡峭。

 

猜你喜欢

转载自blog.csdn.net/kwame211/article/details/80734625