2015-07-13 147 views
2

我想用KDEGaussian 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(但对我来说看起来不错)。

回答

2

您误解了这里关于概率密度的假设。密度集成一个,而其在某些点值是绝对不会1.

让我们用下面的公式从the linked Wikipedia article您似乎使用讨论:

enter image description here

这个公式提供密度f_h(x)在点x评估。

从我的评论中,您的代码正确评估了此数量。然而,你误解了应该是一个的数量。作为密度,积分在整个空间应该产生一个,即

此属性称为正常化密度

此外,作为密度本身,在整个空间上进行积分时,每个加数f_h(x)应该产生1/n,此时还包括归一化常数。同样,对于加数值的值也没有保证。

在一个维度,您可以轻松地通过使用梯形规则或其他正交方案确认正常化

+0

希望那OK(--IF你提供工作的例子,我可以尝试这样做。):HTTP: //coliru.stacked-crooked.com/a/44008bf221855982 – Roby

+0

@Roby:参见[here](http://coliru.stacked-crooked.com/a/ec7fedfbd102b5e5)。请注意,我改变了一些东西,但积分总是'1'(不管加数'n')。 – davidhigh