分类: C#/.net
2016-04-25 09:29:10
直方图密度估计是较为传统的非参密度估计方法,通常我们的做法:
1 将数据值覆盖的数据区间分成几个等子区间(bin)。
2 一个数据值落到这个相应的子区间,这个子区间块的高度就相应的加一个单位的高度。
举个wiki上的例子:
现在有6个数据点:x1=-2.1, x2=-1.3, x3=-0.4, x4=1.9, x5=5.1, x6=6.2.我们取子区间的宽度为2,然后按照步骤2依次操作:
图1 构造的直方图
这样我们就利用样本数据构造出了概率密度函数。
但是从图中很显然,利用直方图估计密度函数还是有不完美的地方:
1 密度函数是不平滑的
2 密度函数受子区间宽度影响很大,如果我们取0.5,5等构造出的密度函数显然与宽度取2的有很大差异。
3 当数据维数是1,2维情况下,直方图的使用是很普遍的,但是在数据维数再增加时,这种方法就有局限性了。
而基于核密度估计的方法就没有直方图的3的局限性。而且当我们采用平滑的核时,概率密度函数也是平滑的;但是当我们采用非平滑核时,概率密度函数也还是不连续的。
kernel density estimation:
假设样本数据值在D维空间服从一个未知的概率密度函数,那么在区域R内的概率为:
概率P的含义就为每个样本数据点落入区域R的概率为P.假设N个样本数据点有K个落入了区域R,那么就应该服从二项分布:
由概率知识可知,在N样本数据很大时,K约等于N*P。而另一方面,我们假设区域R足够小的话,那么P约等于p(x)*V(V为区域R的空间) 。结合两个不等式子可得:
(1)
那么,接下来根据等式(1)来估算p(x)就有两条路可以走:
1 K不变,我们通过决定区域V的大小来估算密度函数,那么我们就采用K-nearer-neighbour方法(这里不具体讨论)。
2 V不变,我们通过决定K的大小来估算密度函数,那么我们采用kernel方法。
我们顺着2的思路走下去。
假设区域R是一个以x为中心,边长为h的极小立方体(也就是V不变),我们现在要考虑的是落入立体体数据点的个数K。我们定义一个kernel函数:
该函数的意义是:数据维数为D维,当样本数据点落入小立方体时,函数值为1,其他情况下为0。所以落入立方提数据点的总个数K就可以表示为:
(2)
那么根据等式(1),把等式(2)代入(1)中,可得:
此处的。
上面我们说过,当kernel density estimation采用平滑核时,估计出的概率密度函数也是平滑的。我们很多情况下都采用Gaussin Kernel.
然而,核密度估计也不是很完美,还是存在着一些缺陷。我们想要获得比较好的概率密度函数,h带宽(bandwidth)的选择就是个很大的问题,太大或者太小都能很大程度上影响p(x)结果。
来个例子理解下(还是上文提到过的6个样本数据点):
假设我们采用Gaussin Kernel,方差取2.25.
注:蓝线代表估计出的p(x),每条红线代表一个样本数据点。
我们看p(x)是连续的,从某种程度上来说就相当于在估计值之外的区域进行插值处理。