我正在使用KDE进行多类分类。我正在使用scikit实现它。
如网站上所述,点x的KDE定义为,
我应该在比较不同类别的不同核密度估计值时对结果进行标准化吗?
KDE的链接:
http://scikit-learn.org/stable/modules/density.html#kernel-density-estimation
答案 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的有效密度,这正是内部发生的事情。