Sklearn kmeans 等价于肘法

新手上路,请多包涵

假设我正在检查多达 10 个集群,我通常使用 scipy 生成“肘部”图,如下所示:

 from scipy import cluster
cluster_array = [cluster.vq.kmeans(my_matrix, i) for i in range(1,10)]

pyplot.plot([var for (cent,var) in cluster_array])
pyplot.show()

从那以后,我开始有动力使用 sklearn 进行聚类,但是我不确定如何像在 scipy 案例中那样创建绘图所需的数组。我最好的猜测是:

 from sklearn.cluster import KMeans

km = [KMeans(n_clusters=i) for i range(1,10)]
cluster_array = [km[i].fit(my_matrix)]

不幸的是,这导致了无效的命令错误。解决这个问题的最佳方法是什么?

谢谢

原文由 Arash Howaida 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 453
2 个回答

您在代码中遇到了一些语法问题。现在应该修复它们:

 Ks = range(1, 10)
km = [KMeans(n_clusters=i) for i in Ks]
score = [km[i].fit(my_matrix).score(my_matrix) for i in range(len(km))]

fit 方法只返回一个 self 对象。在原始代码的这一行

cluster_array = [km[i].fit(my_matrix)]

cluster_array 最终将具有与 km 相同的内容。

您可以使用 score 方法来估计聚类的拟合程度。要查看每个集群的分数,只需运行 plot(Ks, score)

原文由 J. P. Petersen 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 Kmeans 类的惯性属性。

假设 X 是您的数据集:

 from sklearn.cluster import KMeans
from matplotlib import pyplot as plt

X = # <your_data>
distorsions = []
for k in range(2, 20):
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(X)
    distorsions.append(kmeans.inertia_)

fig = plt.figure(figsize=(15, 5))
plt.plot(range(2, 20), distorsions)
plt.grid(True)
plt.title('Elbow curve')

原文由 Ahmed Besbes 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进