单变量一维数据聚类求助:KMeans仅生成单一集群问题
解决单变量K-Means聚类全部分到同一簇的问题
问题核心原因
你遇到的问题是数据维度不匹配:sklearn的KMeans.fit()要求输入为二维数组(格式为(样本数, 特征数)),如果你的X是一维数组(比如形状(10000,)),会被误识别为1个样本、10000个特征,导致聚类逻辑异常,最终所有样本被错误分配到同一簇。
具体解决方案
1. 调整数据维度(必做)
把一维数据转换为二维格式,最简便的方式是使用reshape(-1, 1):
import numpy as np import matplotlib.pyplot as plt from matplotlib import style from sklearn.cluster import KMeans style.use("ggplot") # 将一维数组转为二维(假设X是你的原始数据) X = X.reshape(-1, 1) # 添加random_state保证聚类结果可复现 kmeans = KMeans(n_clusters=5, random_state=42) kmeans.fit(X) centroid = kmeans.cluster_centers_ labels = kmeans.labels_ print(centroid) print(labels)
2. 可选:数据标准化(优化聚类效果)
从你的质心输出能看到,数据数值范围差异极大(从4k到63万),而K-Means基于欧氏距离计算,大数值会主导聚类结果。可以先对数据做标准化处理,让数值分布更合理:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() # 先转二维再标准化 X_scaled = scaler.fit_transform(X.reshape(-1, 1)) kmeans = KMeans(n_clusters=5, random_state=42) kmeans.fit(X_scaled) # 若需要还原质心到原始数据范围 centroid_original = scaler.inverse_transform(kmeans.cluster_centers_) print(centroid_original)
结果验证
修正后labels会呈现0-4的不同值,对应5个簇。还可以通过可视化直观确认:
plt.scatter(X, np.zeros_like(X), c=labels, cmap='viridis') plt.scatter(centroid, np.zeros_like(centroid), marker='X', s=200, linewidths=3, color='red') plt.show()
内容的提问来源于stack exchange,提问作者Zerone
相关产品推荐
相关产品推荐

