You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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]}")

代码说明

  1. 特征提取:从每个元组中提取第一个数值元素,构造成(n_samples, 1)的二维数组,这是KMeans要求的输入格式。
  2. 轮廓系数计算:使用fit_predict()直接获取聚类标签,避免混淆模型对象和标签。
  3. 分组逻辑:根据最终聚类标签,将原列表中的元组分配到对应的聚类组中,保证输出的是原始完整元组。
  4. 随机种子:添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:23:14