【问题标题】:Matching different labelling assign by KMeans匹配由 KMeans 分配的不同标签
【发布时间】:2022-01-04 16:58:45
【问题描述】:

我有以下问题:

  • 我有两个相似的数据集,由 3 列浮点数组成,在 [-1, 1] 范围内标准化
  • 我可以毫无问题地计算每个数据集上的 KMeans

现在,鉴于两个数据集之间的相似性,我想稍微“破解”它们并“匹配”算法找到的集群之间的标签。

例如:

  1. 在数据集 A 中,我发现了一个质心在位置 (1, 1) 的簇,并且算法分配了标签 0 到该簇中的所有点。数据集中还有另一个簇,这次由质心 (2, 2) 和标签 1

    标识
  2. 在数据集 B 中,我有类似形状的集群,但是标签 0 现在与质心 (1.4, 1.1) 的集群相关联 strong> 而 1 与位置 (2.1, 1.9)

    的簇相关联

这种变化是为了强调质心在不同集群中的位置因数据集而异。

我想找到一种方法来重新标记这些段,使得在数据集 B 中,属于具有更接近 (1, 1) 的质心的集群的所有点都将具有相同的标签(对于其他可能的集群)。

有什么想法吗?

提前非常感谢,请原谅我的英语(不是母语)。

保罗

【问题讨论】:

    标签: python labeling


    【解决方案1】:

    可以使用其中一个特征的平均值来获取集群标签。我们可以通过切换输入的顺序来强制 kmeans 产生乱序的标签。在第二个示例中,我交换了数组位置,并将 feature1 增加了 10 倍。

    我们可以在 pandas 中使用此功能的平均值以及 .rank() 来解决问题。如果您的均值不太清楚,或者您有很多特征,这当然可能更具挑战性。无论如何,这也许可以为您指明正确的方向。

    from sklearn.cluster import KMeans
    import numpy as np
    import pandas as pd
    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)
    df = pd.DataFrame(X, columns=['feature1','feature2'])
    df['cluster'] = kmeans.labels_
    df['rank'] = df.cluster.map(df.groupby('cluster')['feature1'].mean().rank()-1)
    print(df)
    

    在此输出中,我们看到排名交换了集群的顺序,因为集群 1 的特征 1 均值较小。

       feature1  feature2  cluster  rank
    0         1         2        1   0.0
    1         1         4        1   0.0
    2         1         0        1   0.0
    3        10         2        0   1.0
    4        10         4        0   1.0
    5        10         0        0   1.0
    

    在第二个示例中,较小的均值已经是集群零,因此排名与集群匹配。

    X = np.array([[100, 2], [100, 4], [100, 0],
                  [10, 2], [10, 4], [10, 0]
                  ])
    kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
    df2 = pd.DataFrame(X, columns=['feature1','feature2'])
    df2['cluster'] = kmeans.labels_
    df2['rank'] = df2.cluster.map(df2.groupby('cluster')['feature1'].mean().rank()-1)
    print(df2)
    
       feature1  feature2  cluster  rank
    0       100         2        1   1.0
    1       100         4        1   1.0
    2       100         0        1   1.0
    3        10         2        0   0.0
    4        10         4        0   0.0
    5        10         0        0   0.0
    

    【讨论】:

      【解决方案2】:

      一种方法是计算每个数据集中质心之间的点积。 您可以使用如下算法

      for a in dsA.centroids:
         b = argmin(dot(a,dsB.centroids)
         # Relabel points in b to match label A
         dsB.centroids.remove(b)
      

      重新标记数据点时需要小心。这样做时,您需要注意不要分配属于您尚未重新标记的数据集的标签。有多种简单的方法可以避免这种破坏。最好的方法取决于您在聚类算法中使用的确切数据结构

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2016-09-11
        • 2021-09-03
        • 2017-07-21
        • 2022-01-23
        相关资源
        最近更新 更多