如何使用scikit规范化核密度估计?

时间:2016-05-11 18:08:59

标签: python machine-learning scikit-learn kernel-density

我正在使用KDE进行多类分类。我正在使用scikit实现它。 如网站上所述,点x的KDE定义为,

我应该在比较不同类别的不同核密度估计值时对结果进行标准化吗?

KDE的链接:
http://scikit-learn.org/stable/modules/density.html#kernel-density-estimation

1 个答案:

答案 0 :(得分:5)

平等不成立,这显然是一个糟糕的文档示例。你可以在代码中看到它是规范化的,比如这里

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)

你也可以潜水deeper into .c code实际计算内核,你会发现它们是内部标准化的

 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的有效密度,这正是内部发生的事情。