核密度分数与Python Scikit的score_samples

13 投票
2 回答
9051 浏览
提问于 2025-04-18 12:49

我最近在用Python和scikit-learn,特别是在使用KernelDensity这个功能。模型训练好后,我想评估一些新点的概率。为此有一个叫score()的方法,但好像不太好用,因为当我输入一个数组时,输出的结果只有一个数字。我试过用score_samples(),但是速度非常慢。

我觉得score这个方法可能有问题,但我没有能力去改进它。如果你们有什么想法,请告诉我。

2 个回答

11

没有代码的话,有点难判断,不过:

我们假设你想要评估的点保存在一个叫做 X 的数组里,并且你有一个核密度估计 kde,所以你会调用:

logprobX = kde.score_samples(X)

但要小心,这些是对数值!所以你还需要做:

probX = np.exp(logprobX) 

这些值是和你的直方图相匹配的(可能是之前计算过的)。

运行这些代码的时间取决于 X 的长度。在我的电脑上,计算7500个点是相当快的。

12

score()这个函数是通过score_samples()来工作的,具体用法如下:

return np.sum(self.score_samples(X))

所以,这就是为什么在你的情况下应该使用score_samples()的原因。

撰写回答