首页 > 解决方案 > 根据最大值对列表值进行分组

问题描述

我正在研究 k-mean 算法来聚类数字列表,如果我有一个数组 (X)

X=array([[0.85142858],[0.85566274],[0.85364912],[0.81536489],[0.84929932],[0.85042336],[0.84899714],[0.82019115], [0.86112067],[0.8312496 ]])

然后我运行以下代码

from sklearn.cluster import AgglomerativeClustering

cluster = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
cluster.fit_predict(X)

for i in range(len(X)):
    print("%4d " % cluster.labels_[i], end=""); print(X[i])

我得到了结果

   1     1  [0.85142858]
   2     3  [0.85566274]
   3     3  [0.85364912]
   4     0  [0.81536489]
   5     1  [0.84929932]
   6     1  [0.85042336]
   7     1  [0.84899714]
   8     0  [0.82019115]
   9     4  [0.86112067]
   10    2  [0.8312496]

如何获得值为 (i) 的每个集群中的最大数量?像这样

0: 0.82019115   8
1: 0.85142858   1
2: 0.8312496    10
3: 0.85566274   2
4: 0.86112067   9

标签: pythonscikit-learncluster-analysisk-means

解决方案


首先使用它们将它们组合在一起,zip然后按值(对的第二个元素)按升序对其进行排序,并从中创建一个字典。

尝试:

res =  list(zip(cluster.labels_, X))
max_num = dict(sorted(res, key=lambda x: x[1], reverse=False))

最大数量:

{0: array([0.82019115]),
 2: array([0.8312496]),
 1: array([0.85142858]),
 3: array([0.85566274]),
 4: array([0.86112067])}

编辑:

你想要这个吗?

elem = list(zip(res, range(1,len(X)+1)))
e = sorted(elem, key=lambda x: x[0][1], reverse=False)
final_dict = {k[0]:(k[1], v) for (k,v) in e}
for key in sorted(final_dict):
    print(f"{key}: {final_dict[key][0][0]} {final_dict[key][1]}")

0: 0.82019115 8
1: 0.85142858 1
2: 0.8312496 10
3: 0.85566274 2
4: 0.86112067 9

或者

import pandas as pd    
df = pd.DataFrame(zip(cluster.labels_,X))
df[1] = df[1].str[0]
df = df.sort_values(1).drop_duplicates([0],keep='last')
df.index = df.index+1
df = df.sort_values(0)

东风:

    0   1
8   0   0.820191
1   1   0.851429
10  2   0.831250
2   3   0.855663
9   4   0.861121

推荐阅读