Brandwdith内核密度python

时间:2016-03-31 11:05:54

标签: python scikit-learn

我试图计算一系列值的核密度函数:

x=[-0.04124324405924407, 0, 0.005249724476788287, 0.03599351958245578, -0.00252785423151014, 0.01007584102031178, -0.002510349639322063, -0.01264302961474806, -0.01797169063489579]

关注此网站:http://mark-kay.net/2013/12/24/kernel-density-estimation/我想计算带宽的最佳值,所以我写了这段代码:

from sklearn.grid_search import GridSearchCV
grid = GridSearchCV(KernelDensity(),{'bandwidth': np.linspace(-1.0, 1.0, 30)},cv=20) # 20-fold cross-validation
grid.fit(x[:, None])
grid.best_params_

但运行时遇到此错误:

grid.fit(x[:, None])

错误:TypeError:列表索引必须是整数,而不是元组

有谁知道如何修复它?谢谢

2 个答案:

答案 0 :(得分:1)

您正在使用py list,您应该使用numpy.array。后者支持更丰富的indexing

import numpy as np
x = np.array([-0.04124324405924407, 0, 0.005249724476788287, 0.03599351958245578, -0.00252785423151014, 0.01007584102031178, -0.002510349639322063, -0.01264302961474806, -0.01797169063489579])

答案 1 :(得分:0)

鉴于样本量较小,我将使用OpenTURNSKernelSmoothing类。默认情况下,它提供了Scott的多维规则。如果需要,我们可以使用Sheather和Jones的直接插件算法,即使分布是多模式的,该算法在很多情况下也可以提供良好的带宽。

以下脚本使用默认带宽。

x = [
    -0.04124324405924407,
    0,
    0.005249724476788287,
    0.03599351958245578,
    -0.00252785423151014,
    0.01007584102031178,
    -0.002510349639322063,
    -0.01264302961474806,
    -0.01797169063489579,
]
import openturns as ot
sample = ot.Sample(x, 1)
factory = ot.KernelSmoothing()
distribution = factory.build(sample)

就是这样。

如果要使用更智能的带宽选择,我们可以使用基于Sheather和Jones的直接“求解方程”规则的computePluginBandwidth方法。在下面的脚本中,我在评估带宽之后绘制分布。

bandwidth = factory.computePluginBandwidth(sample)
distribution = factory.build(sample, bandwidth)
distribution.drawPDF()

带宽评估为0.00941247。 PDF以下。

PDF estimated from KernelSmoothing