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

los*_*_19 3 python machine-learning kernel-density scikit-learn

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

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

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

lej*_*lot 5

平等不成立,这显然是一个糟糕的文档示例.您可以在代码中看到它已标准化,就像这里一样

log_density -= np.log(N)
return log_density
Run Code Online (Sandbox Code Playgroud)

所以你明显分开了N.

从数学的角度来看,正确的公式实际上也是

1/N SUM_i K(x_i - x)
Run Code Online (Sandbox Code Playgroud)

要么

1/(hN) SUM_i K((x_i - x)/h)
Run Code Online (Sandbox Code Playgroud)

您还可以深入了解实际计算内核的.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;
Run Code Online (Sandbox Code Playgroud)

因此,每个K实际上都集成到了1,因此你只需要取一个平均值来获得整个KDE的有效密度,这正是内部发生的事情.