5

我正在尝试从使用 scikit-learn 模块计算的 KDE 计算 PDF 估计值。我已经看到了 2 种评分变体,我都在尝试:下面的语句 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 成功地尝试过了,所以数据没有问题。

4

2 回答 2

10

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

 ValueError: query data dimension must match training data dimension

这里的问题是你有一维数组数据,但是当你将它提供给 fit() 函数时,它假设你只有一个多维数据点!因此,例如,如果您的训练数据大小为 100000 点,则您的 d 为 100000x1,但 fit 将它们视为 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!

于 2015-01-02T21:07:58.893 回答
1

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

于 2014-12-19T01:14:39.520 回答