猿问

根据最大值对列表值进行分组

我正在研究 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


陪伴而非守候
浏览 112回答 1
1回答

婷婷同学_

首先将它们组合成对使用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 81: 0.85142858 12: 0.8312496 103: 0.85566274 24: 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+1df = df.sort_values(0)df:    0   18   0   0.8201911   1   0.85142910  2   0.8312502   3   0.8556639   4   0.861121
随时随地看视频慕课网APP

相关分类

Python
我要回答