Sklearn kmeans相当于肘法

Ara*_*ida 12 scipy python-3.x scikit-learn

假设我正在检查多达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()
Run Code Online (Sandbox Code Playgroud)

我已经开始使用sklearn进行聚类,但是我不知道如何在scipy情况下创建绘制所需的数组.我最好的猜测是:

from sklearn.cluster import KMeans

km = [KMeans(n_clusters=i) for i range(1,10)]
cluster_array = [km[i].fit(my_matrix)]
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这导致了无效的命令错误.sklearn最好的方式是什么?

谢谢

小智 22

你可以使用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')
Run Code Online (Sandbox Code Playgroud)


J. *_*sen 10

您在代码中遇到了一些语法问题.他们现在应该修好:

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))]
Run Code Online (Sandbox Code Playgroud)

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

cluster_array = [km[i].fit(my_matrix)]
Run Code Online (Sandbox Code Playgroud)

最终cluster_array会有与之相同的内容km.

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

  • 稍微多一些pythonic:score = [k.fit(my_matrix).score(my_matrix)for km in km] (2认同)

小智 6

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

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()
Run Code Online (Sandbox Code Playgroud)