我在多类分类中使用KDE(核密度估计)。我使用scikit来实现它。如网站所述,点x的KDE定义为,
在比较不同类别的不同核密度估计时,我应该规范化结果吗?
KDE的链接:
http://scikit-learn.org/stable/modules/density.html#kernel-density-estimation
回答:
等式不成立,这显然是一个糟糕的文档示例。你可以在代码中看到它是规范化的,就像这里
log_density -= np.log(N)return log_density
所以你显然是除以N
的。
从数学角度来看,正确的公式实际上是
1/N SUM_i K(x_i - x)
或者
1/(hN) SUM_i K((x_i - x)/h)
你也可以深入研究.c代码,实际计算核函数,你会发现它们在内部是规范化的
case __pyx_e_7sklearn_9neighbors_9ball_tree_GAUSSIAN_KERNEL: /* "binary_tree.pxi":475 * cdef ITYPE_t k * if kernel == GAUSSIAN_KERNEL: * factor = 0.5 * d * LOG_2PI # <<<<<<<<<<<<<< * elif kernel == TOPHAT_KERNEL: * factor = logVn(d) */ __pyx_v_factor = ((0.5 * __pyx_v_d) * __pyx_v_7sklearn_9neighbors_9ball_tree_LOG_2PI); break;
因此,每个K
实际上积分为1
,因此你只需取平均值就能得到整个KDE的有效密度,这就是内部发生的事情。