核密度估计器(带有高斯内核)和f(x)= 1?
问题描述:
我想用KDE和Gaussian Kernel。如果我没错,所有f(x)的总和必须是1(〜四舍五入)?核密度估计器(带有高斯内核)和f(x)= 1?
我的实现看起来是这样的:
float K(float const& val)
{
const float p=1.0/std::sqrt(2.0 * M_PI);
float result = 0.5 * (val*val);
result = p * std::exp(- result);
return result;
};
std::vector< std::pair<float, float> kde(float *val, int len float h)
{
std::vector< std::pair<float, float>> density(len);
const float p = 1.0/(h * len);
for(int r=0;r<len;r++)
{
float sum = 0;
for(int i=0;i<len;i++)
sum += k((val[r] - val[i])/h);
density[r] = std::make_pair(val[r], p*sum);
}
return density;
}
我选用H> 0。我是对的p *总和是值的概率val [r]?所有概率之和大于1(但对我来说看起来不错)。
答
您误解了这里关于概率密度的假设。密度集成一个,而其在某些点值是绝对不会1.
让我们用下面的公式从the linked Wikipedia article您似乎使用讨论:
这个公式提供密度f_h(x)
在点x
评估。
从我的评论中,您的代码正确评估了此数量。然而,你误解了应该是一个的数量。作为密度,积分在整个空间应该产生一个,即
此属性称为正常化密度。
此外,作为密度本身,在整个空间上进行积分时,每个加数f_h(x)
应该产生1/n
,此时还包括归一化常数。同样,对于加数值的值也没有保证。
在一个维度,您可以轻松地通过使用梯形规则或其他正交方案确认正常化
希望那OK(--IF你提供工作的例子,我可以尝试这样做。):HTTP: //coliru.stacked-crooked.com/a/44008bf221855982 – Roby
@Roby:参见[here](http://coliru.stacked-crooked.com/a/ec7fedfbd102b5e5)。请注意,我改变了一些东西,但积分总是'1'(不管加数'n')。 – davidhigh