【问题标题】:Scikit learn Kmeans assigning a label to input dataScikit 学习 Kmeans 为输入数据分配标签
【发布时间】:2017-07-21 11:30:15
【问题描述】:

我想为每个输入数据分配一个标签;例如,data[0] 是'k',data[2] 是'b',data[5] 是'j',data[13] 是另一个'k',......等等。

在完成这里显示的聚类后:3D plot of 2 clusters,我想检索每个聚类中每个“点标签”的类型。

import numpy as np
from sklearn.cluster import KMeans 
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

data = np.array([[-7.82,4.58,-3.97],[-6.68,3.16,2.71],
[4.36,-2.19,2.09],[6.72,0.88,2.80],
[-8.64,3.06,3.50],[-6.87,0.57,-5.45],
[4.47,-2.62,5.76],[6.73,-2.01,4.18],
[-7.71,2.34,-6.33],[-6.91,-0.49,-5.68],
[6.18,2.81,5.82],[6.72,-0.93,-4.04],
[-6.25,-0.26,0.56],[-6.94,-1.22,1.13],
[8.09,0.20,2.25],[6.81,0.17,-4.15],
[-5.19,4.24,4.04],[-6.38,-1.74,1.43],
[4.08,1.30,5.33],[6.27,0.93,-2.78]])


centers = np.array([[1,1,1],[-1,1,-1]])
model_ = KMeans(n_clusters=2, init = centers, n_init=1).fit(data)
print('The labels for Part a are %s' % model_.labels_)
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(data[:,0], data[:,1],  data[:,2],c=model_.labels_.astype(float),s=70)
plt.title('Visualizing Clusters')
ax.set_xlabel('X1', fontsize = 10)
ax.set_ylabel('X2', fontsize = 10)
ax.set_zlabel('X3', fontsize = 10)
plt.show()

【问题讨论】:

    标签: python scikit-learn k-means


    【解决方案1】:

    您可以使用labels = model_.labels_ 检索标签。例如,您可以使用sum(labels[0:9] == 0) 计算集群零上“左”的数量。

    【讨论】:

    • 感谢您的回复,我编辑了问题,也许现在更清楚了。
    • 只需使用每个数据点的标签创建一个数组,遵守data 数组中的顺序。 assigned_labels = np.array(['k', 'b', ...',k', ...])。例如,sum(labels[assigned_labels == 'k'] == 0) 将返回分配给集群0 的标签为“k”的元素的数量。
    • 我不确定返回的是什么!我试过了: labels = np.array([2, 0, 1]) 和 assignment_labels = np.array(['k', 'b',',k']) ,labels[assigned_labels == 'k'] 返回数组([2]),标签[assigned_labels == 'b'] 返回数组([0])。
    • 这些数组是'k'类型和'b'类型元素的簇标签。现在你可以通过sum(labels[assigned_labels == 'k'] == cluster_label)来数数。
    • 那么这根本行不通,因为 A)它忽略了第二个 K,B)我想检索某个类中的类型,而不是某个类型的类。
    【解决方案2】:

    如果您想为行分配字母,例如可以使用 pandas。

    >>> import pandas as pd
    >>> indexes = [chr(ord('a') + i) for i in range(data.shape[0])]
    >>> indexes
    ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't']
    >>> data = pd.DataFrame(data, index=indexes) # pass your old data variable
    >>> data
          0     1     2
    a -7.82  4.58 -3.97
    b -6.68  3.16  2.71
    c  4.36 -2.19  2.09
    d  6.72  0.88  2.80
    e -8.64  3.06  3.50
    f -6.87  0.57 -5.45
    g  4.47 -2.62  5.76
    h  6.73 -2.01  4.18
    i -7.71  2.34 -6.33
    j -6.91 -0.49 -5.68
    k  6.18  2.81  5.82
    l  6.72 -0.93 -4.04
    m -6.25 -0.26  0.56
    n -6.94 -1.22  1.13
    o  8.09  0.20  2.25
    p  6.81  0.17 -4.15
    q -5.19  4.24  4.04
    r -6.38 -1.74  1.43
    s  4.08  1.30  5.33
    t  6.27  0.93 -2.78
    >>> data.loc['a']
    0   -7.82
    1    4.58
    2   -3.97
    Name: a, dtype: float64
    

    【讨论】:

      【解决方案3】:

      由于 models_.labels_ 的输出将完全按照输入的顺序排列,您只需创建一个列表,将附加标签信息与输入列表并行存储。

      (来自https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html

      >>> from sklearn.cluster import KMeans
      >>> import numpy as np
      >>> X = np.array([[1, 2], [1, 4], [1, 0],
      ...               [10, 2], [10, 4], [10, 0]])
      >>> kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
      >>> kmeans.labels_
      array([1, 1, 1, 0, 0, 0], dtype=int32)
      

      请注意,标签输出与您的输入顺序相匹配。

      【讨论】:

        猜你喜欢
        • 2017-09-01
        • 2020-11-11
        • 2015-08-26
        • 2016-09-02
        • 2018-10-17
        • 2016-10-01
        • 2014-04-20
        • 2021-09-22
        • 2016-11-27
        相关资源
        最近更新 更多