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

How to normalize Kernel Density Estimation using scikit?

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

我是否应该在比较不同 classes 的不同核密度估计值时对结果进行归一化?

Link 对于 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)

你也可以潜入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 的有效密度,而这正是内部发生的情况。