【发布时间】:2015-08-22 04:29:47
【问题描述】:
我有类似以下 fromat 的数据集,我试图找出具有最佳带宽的内核密度估计。
data = np.array([[1, 4, 3], [2, .6, 1.2], [2, 1, 1.2],
[2, 0.5, 1.4], [5, .5, 0], [0, 0, 0],
[1, 4, 3], [5, .5, 0], [2, .5, 1.2]])
但我不知道如何处理它。还有如何找到 Σ 矩阵。
更新
我尝试了 scikit-learn 工具包中的 KDE 函数来找出单变量 (1D) kde,
# kde function
def kde_sklearn(x, x_grid, bandwidth):
kde = KernelDensity(kernel='gaussian', bandwidth=bandwidth).fit(x)
log_pdf = kde.score_samples(x_grid[:, np.newaxis])
return np.exp(log_pdf)
# optimal bandwidth selection
from sklearn.grid_search import GridSearchCV
grid = GridSearchCV(KernelDensity(), {'bandwidth': np.linspace(.1, 1.0, 30)}, cv=20)
grid.fit(x)
bw = grid.best_params_
# pdf using kde
pdf = kde_sklearn(x, x_grid, bw)
ax.plot(x_grid, pdf, label='bw={}'.format(bw))
ax.legend(loc='best')
plt.show()
谁能帮我把它扩展到多变量/在这种情况下是 3D 数据?
【问题讨论】:
-
我想知道是否可以提供帮助,但需要了解更多。我可以看到每个数据点将具有三个值,但是按照您编写它的方式,这些三元组被进一步分组为三个一组。您的输入数据被分组两次是有原因的吗?还想仔细检查 Σ 矩阵的含义。我假设你的意思是估计的数据协方差 - 所以你可以使用 Σ^(-1/2) 的经验法则带宽?如果是这样,您打算将其作为开始带宽优化的地方,还是代替优化?
-
我的回答有帮助吗?如果没有 - 请随意添加一些 cmets,因为我可能会根据您的需要对其进行调整。
-
@JRichardSnape 你是对的,我对数据进行了错误的分组,实际上在我的代码中它就像你实现的一样,但是当复制代码时我搞砸了。是的,我指的是协方差矩阵。
-
好的。但我仍然不确定我下面的回答是否有帮助 - 这是否让你得到你想要的?或者你的问题还有什么?如果你想输出协方差矩阵,我可以添加。
标签: python numpy machine-learning scikit-learn kernel-density