Python KMeans聚类筛选损失低于阈值的簇头及ValueError报错解决
聚类筛选低损失簇头解决方案
报错原因
你构造的min_losses是嵌套列表结构,每个元素是[损失值]的单元素列表,而你传入index()方法的min_loss_temp结构与列表元素不匹配,无法找到对应下标,因此抛出ValueError。
完整实现代码
import warnings import numpy as np import pandas as pd from sklearn.cluster import KMeans %matplotlib inline warnings.filterwarnings('ignore') # 原始损失数据 loss_data = np.array([1.453158736228, 4.71358454227, 2.22189044952, 1.369125723838, 1.294319868087, 3.604614257, 1.282392263412, 1.035766720771, 3.537582755088, 1.647409796714, 2.12351524829, 1.522501230239, 1.092259526252, 3.8876036, 2.12351319]) df = loss_data.reshape(-1, 1) # KMeans聚类,设置n_clusters=3和你的簇划分对应 kmeans = KMeans(n_clusters=3, random_state=42) clusters = kmeans.fit_predict(df) # 整合为结构化数据表,三列分别对应元素索引、簇编号、损失值 result_df = pd.DataFrame({ 'element': range(len(loss_data)), 'Clusters': clusters, 'loss': loss_data }) # 筛选损失低于阈值3的记录,对应你期望的输出结果 threshold = 3 filtered_res = result_df[result_df['loss'] < threshold].reset_index(drop=True) print("损失低于阈值的所有元素:") print(filtered_res) # 如果需要额外提取每个簇的最小损失簇头,新增以下代码即可 cluster_heads = result_df[result_df['loss'] < threshold].groupby('Clusters', as_index=False).apply(lambda x: x[x['loss'] == x['loss'].min()]).reset_index(drop=True) print("\n各簇最小损失簇头:") print(cluster_heads)
功能说明
- 用DataFrame整合索引、簇标签、损失值三类数据,避免手动维护列表对应关系出错
- 筛选逻辑直接用布尔索引实现,比手动遍历列表更简洁不易出错
- 若需要提取每个簇的最小损失簇头,用groupby按簇分组后取每组损失最小值对应的行即可
内容的提问来源于stack exchange,提问作者Alex AM
相关产品推荐
相关产品推荐

