我试图计算一系列值的核密度函数:
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:列表索引必须是整数,而不是元组
有谁知道如何修复它?谢谢
答案 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)
鉴于样本量较小,我将使用OpenTURNS的KernelSmoothing
类。默认情况下,它提供了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以下。