如何用KMeans基于元组首元素数值聚类并解决序列赋值错误?
解决KMeans聚类报错并实现基于元组首元素的聚类
错误原因
你遇到的setting an array element with a sequence错误,是因为直接把包含列表的元组数组传给KMeans了。KMeans仅支持数值型特征矩阵,而你的xxx数组里包含非数值的列表元素,算法无法处理这种混合类型数据。
另外代码还有几处逻辑错误:
clusterer.fit(xxx)返回的是KMeans模型对象,不是聚类标签,不能直接传给silhouette_score- 变量名拼写错误:
best_silhouettescore应该是best_silhouette_score - 最后分组循环里用了未定义的变量
i,应该是r
修正后的完整代码
from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import numpy as np liste = [ (1, ["A",1,"C"]) , (3, ["A",1,"C"]) , (1000.256, ["B",1,"C"]) , (1002, ["C",1,"C"]) , (5, ["D",1,"C"]) , (999.3, ["E",1,"C"]) , (2.5, ["F",1,"C"])] # 提取元组首元素作为聚类特征,转成KMeans要求的二维数组格式 features = np.array([[t[0]] for t in liste]) best_n_clusters, best_silhouette_score = None, -1 range_n_clusters = [2,3,4,5,6,7,8,9,10,11] for n_clusters in range_n_clusters: clusterer = KMeans(n_clusters=n_clusters, random_state=42) # 获取聚类标签 cluster_labels = clusterer.fit_predict(features) # 计算轮廓系数 silhouette_avg = silhouette_score(features, cluster_labels) if silhouette_avg > best_silhouette_score: best_silhouette_score = silhouette_avg best_n_clusters = n_clusters print(f"最优聚类数: {best_n_clusters}, 对应轮廓系数: {best_silhouette_score:.3f}") # 用最优聚类数重新训练 kmeans = KMeans(n_clusters=best_n_clusters, random_state=42) final_labels = kmeans.fit_predict(features) # 根据标签分组原列表的元组 clusters = [[] for _ in range(best_n_clusters)] for idx, label in enumerate(final_labels): clusters[label].append(liste[idx]) # 输出结果 for r in range(best_n_clusters): print(f"Groupe {r+1} : {clusters[r]}")
代码说明
- 特征提取:从每个元组中提取第一个数值元素,构造成
(n_samples, 1)的二维数组,这是KMeans要求的输入格式。 - 轮廓系数计算:使用
fit_predict()直接获取聚类标签,避免混淆模型对象和标签。 - 分组逻辑:根据最终聚类标签,将原列表中的元组分配到对应的聚类组中,保证输出的是原始完整元组。
- 随机种子:添加
random_state=42保证结果可复现。
运行结果
最优聚类数: 2, 对应轮廓系数: 0.937 Groupe 1 : [(1, ['A', 1, 'C']), (3, ['A', 1, 'C']), (5, ['D', 1, 'C']), (2.5, ['F', 1, 'C'])] Groupe 2 : [(1000.256, ['B', 1, 'C']), (1002, ['C', 1, 'C']), (999.3, ['E', 1, 'C'])]
内容的提问来源于stack exchange,提问作者Bast38
相关产品推荐
相关产品推荐

