我正在尝试使用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成功尝试了这一点,因此数据没有问题。
答案 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()函数,然后才能从分布中进行采样。