Scikit Learn 中的核密度

数据挖掘 scikit-学习 核心
2022-03-10 03:47:25

我试图了解 scikit-learn 中的 KernelDensity 类是如何工作的。考虑以下两种情况,它们从两个不同的数组 (a) 构建内核。我想知道为什么在这两种情况下对数组 b 的评分结果是相同的?来自 10 个相同点的内核不应该与来自 2 个点的内核不同吗?10 个点中的一个应该表示更多的密度。那么,为什么两种情况下最终的评分结果是一样的呢?

案例一:

a = np.array([[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]])

kde = KernelDensity(bandwidth=0.1)

kde.fit(a)

b = np.array([[1]])

log_dens = kde.score_samples(b)

print('Probability is: {}'.format(np.exp(log_dens)))

概率是:[3.9894228]

案例B:

a = np.array([[1],[1]])

kde = KernelDensity(bandwidth=0.1)

kde.fit(a)

b = np.array([[1]])

log_dens = kde.score_samples(b)

print('Probability is: {}'.format(np.exp(log_dens)))

概率是:[3.9894228]

1个回答

首先,score_samplesSKLearn 的Kernel Density对象的函数返回概率密度的对数,而不是概率的对数。因此,它的指数并不完全是概率 - 例如,在您的示例中,您的概率高于 1,这是不可能的。

其次,显然对数概率密度由内核训练的点数标准化(参见此处的第 210 行,其中log_density -= np.log(N).

这有效地改变了表达式ρK(y)=i=1NK(yxi;h)(来自用户指南)到ρK(y)=1Ni=1NK(yxi;h),即将火车集合中各点的总和转换为整个火车集合的平均值。

顺便说一句,我认为这就是他们在函数描述中这一行的意思:

这被归一化为概率密度,因此对于高维数据,该值将较低。

但我同意这有点不清楚。