核密度估计器(使用高斯核)和 f(x) = 1?
Kernel Density Estimator ( with Gauss Kernel ) Sum f(x) = 1?
我想使用 KDE with the Gaussian 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 > 0。 p*sum 是值 val[r] 的概率,我说得对吗?所有概率的总和> 1(但对我来说看起来没问题)。
您误解了此处关于概率密度的假设。密度积分为1,而它在某些点的值肯定不是1。
让我们使用您似乎使用的 the linked Wikipedia article 中的以下公式来讨论它:
此公式提供在点 x
处计算的密度 f_h(x)
。
根据我的审查,您的代码正确地评估了这个数量。但是,您误解了应该是一个的数量。作为密度,完整 space 上的 积分 应该产生一个,即
这个属性叫做密度的归一化。
此外,作为密度本身,f_h(x)
的每个加数在对整个 space 进行积分时应该产生 1/n
,其中还包括归一化常数。同样,不能保证被加数的值。
在一个维度上,您可以使用梯形规则或其他正交方案轻松确认归一化(--如果您提供一个工作示例,我可以尝试这样做。)
我想使用 KDE with the Gaussian 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 > 0。 p*sum 是值 val[r] 的概率,我说得对吗?所有概率的总和> 1(但对我来说看起来没问题)。
您误解了此处关于概率密度的假设。密度积分为1,而它在某些点的值肯定不是1。
让我们使用您似乎使用的 the linked Wikipedia article 中的以下公式来讨论它:
此公式提供在点 x
处计算的密度 f_h(x)
。
根据我的审查,您的代码正确地评估了这个数量。但是,您误解了应该是一个的数量。作为密度,完整 space 上的 积分 应该产生一个,即
这个属性叫做密度的归一化。
此外,作为密度本身,f_h(x)
的每个加数在对整个 space 进行积分时应该产生 1/n
,其中还包括归一化常数。同样,不能保证被加数的值。
在一个维度上,您可以使用梯形规则或其他正交方案轻松确认归一化(--如果您提供一个工作示例,我可以尝试这样做。)