Scikit-Learn KDE中的PDF估算

时间:2014-12-17 06:06:50

标签: python scikit-learn kernel-density

我正在尝试使用scikit-learn模块计算从KDE计算的PDF估算值。我已经看到了两种评分变体,我正在尝试两种:下面的陈述A和B.

陈述A导致以下错误:

  

AttributeError:'KernelDensity'对象没有属性'tree _'

语句B导致以下错误:

  

ValueError:查询数据维度必须与培训数据维度匹配

似乎是一个愚蠢的错误,但我无法弄清楚。请帮忙。代码如下......

from sklearn.neighbors import KernelDensity
import numpy

# d is my 1-D array data
xgrid = numpy.linspace(d.min(), d.max(), 1000)

density = KernelDensity(kernel='gaussian', bandwidth=0.08804).fit(d)

# statement A
density_score = KernelDensity(kernel='gaussian', bandwidth=0.08804).score_samples(xgrid)

# statement B
density_score = density.score_samples(xgrid)

density_score = numpy.exp(density_score)

如果有帮助,我使用0.15.2版本的scikit-learn。我已经使用scipy.stats.gaussian_kde成功尝试了这一点,因此数据没有问题。

2 个答案:

答案 0 :(得分:8)

使用语句B,我遇到了与此错误相同的问题:

 ValueError: query data dimension must match training data dimension

这里的问题是你有1-D数组数据,但当你把它提供给fit()函数时,它假设你只有1个数据点有很多维度!例如,如果你的训练数据大小是100000分,你的d是100000x1,但是适合将它们当作1x100000 !!

所以,你应该在拟合之前重新塑造你的d: d.reshape(-1,1) xgrid.shape(-1,1)

density = KernelDensity(kernel='gaussian', bandwidth=0.08804).fit(d.reshape(-1,1))
density_score = density.score_samples(xgrid.reshape(-1,1))

注意:语句A的问题是你在一个不合适的对象上使用了score_samples!

答案 1 :(得分:1)

您需要先调用fit()函数,然后才能从分布中进行采样。