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

单变量一维数据聚类求助: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:55:34