核密度估计(高斯核)和f(x)= 1?

时间:2015-07-13 05:45:42

标签: c++ c gaussian kernel-density probability-density

我想将KDEGaussian Kernel一起使用。如果我是正确的,所有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&gt; 0 即可。我是对的吗 p * sum 是值 val [r] 的概率?所有概率的总和是> 1(但对我来说还不错)。

1 个答案:

答案 0 :(得分:2)

你误解了概率密度的假设。密度积分为1,而其在某些点的值绝对不是1。

让我们使用您似乎使用的the linked Wikipedia article中的以下公式进行讨论:

enter image description here

此公式提供了在f_h(x)点评估的密度x

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

此属性称为密度的规范化

此外,作为密度本身,f_h(x)的每个加数在整合到整个空间时应该产生1/n,当一个也包括归一化常数时。同样,不能保证加数值。

在一个维度中,您可以通过使用梯形规则或其他正交方案轻松确认规范化( - 如果您提供一个工作示例,我可以尝试这样做。)