假设我正在检查多达 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)]
不幸的是,这导致了无效的命令错误。最好的方法是什么?
谢谢
可以使用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')
代码中存在一些语法问题。它们现在应该被修复:
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)
。
您还可以使用每个数据之间的欧氏距离和聚类中心距离来评估要选择的聚类数。下面是代码示例。
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()