【问题标题】:Sklearn kmeans equivalent of elbow methodSklearn kmeans等效于肘部方法
【发布时间】: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 解决此问题的最佳方法是什么?

谢谢

【问题讨论】:

    标签: python-3.x scipy scikit-learn


    【解决方案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
      猜你喜欢
      • 2023-03-15
      • 2021-06-07
      • 2016-12-23
      • 2021-06-21
      • 2019-11-18
      • 2018-10-10
      • 2018-10-04
      • 2018-02-17
      • 2021-04-20
      相关资源
      最近更新 更多