Sklearn kmeans等效于肘部方法

Posted

技术标签:

【中文标题】Sklearn kmeans等效于肘部方法【英文标题】:Sklearn kmeans equivalent of elbow method 【发布时间】:2017-05-23 06:50:38 【问题描述】:

假设我正在检查多达 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)]

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

谢谢

【问题讨论】:

【参考方案1】:

您还可以使用每个数据之间的欧几里得距离和聚类中心距离来评估要选择多少个聚类。这是代码示例。

import numpy as np
from scipy.spatial.distance import cdist
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

iris = load_iris()
x = iris.data

res = list()
n_cluster = range(2,20)
for n in n_cluster:
    kmeans = KMeans(n_clusters=n)
    kmeans.fit(x)
    res.append(np.average(np.min(cdist(x, kmeans.cluster_centers_, 'euclidean'), axis=1)))

plt.plot(n_cluster, res)
plt.title('elbow curve')
plt.show()

【讨论】:

其他答案已使用 sklearn kmeans 对象的 kmeans.inertia_ 属性来衡量拟合的好坏。 sklearn documentation 声明:“惯性_:样本到最近的聚类中心的距离平方和,如果提供,则按样本权重加权。”所以这与您建议的计算几乎相同,但显然会更快,因为我猜它已经计算过了。【参考方案2】:

您可以使用 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')

【讨论】:

【参考方案3】:

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

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)

【讨论】:

格式化,score = [KMeans(i).fit(my_matrix).score(my_matrix) for i in Ks] 稍微更pythonic:score = [k.fit(my_matrix).score(my_matrix) for k in km] my_matrix 是如何定义的? @jbehrens94 传入您的数据、数据框等代替 my_matrix

以上是关于Sklearn kmeans等效于肘部方法的主要内容,如果未能解决你的问题,请参考以下文章

Kmeans肘子方法不返回肘子。

R语言KMeans聚类分析确定最优聚类簇数实战:肘部法则elbow method(确定最优聚类簇数)

实施肘部方法以找到 R 中 K-Means 聚类的最佳聚类数 [关闭]

机器学习sklearn----初识KMeans

sklearn kmeans.predict 方法不正确

K 表示当肘部图是平滑曲线时找到肘部