【问题标题】:How to normalize Kernel Density Estimation using scikit?如何使用 scikit 标准化核密度估计?
【发布时间】:2016-09-07 07:23:24
【问题描述】:

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

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

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

【问题讨论】:

  • KDE 估计概率密度 - 如果我没记错的话,密度是根据定义规范的。不知道为什么公式不规范 - IMO 等于不成立。

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回答。要清楚,我不需要做任何事情,因为它在内部正常化?我可以比较不同的 KDE 吗?
  • 是的,有归一化的。在比较方面 - 这取决于您想通过这种比较实现什么,但原则上是的,它们是可比较的。如果你做分类,那么没有。分类也应该包括先验类,KDE 只是生成模型,因此您必须添加与类大小成比例的权重才能获得基于准确性的模型。如果你不添加这个,你会做“平衡”的准确性
猜你喜欢
  • 2021-12-16
  • 2020-04-23
  • 1970-01-01
  • 2016-05-07
  • 2017-05-09
  • 1970-01-01
  • 2018-10-06
  • 2016-10-14
  • 1970-01-01
相关资源
最近更新 更多