可以使用其中一个特征的平均值来获取集群标签。我们可以通过切换输入的顺序来强制 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