如何对一维MSE数据执行K-Means聚类?附CSV数据实例
嘿,我懂你的疑惑——只用MSE这一个特征做K-Means聚类,确实会纠结该怎么给模型输入X和Y对吧?其实完全没问题!K-Means完全支持一维数据的聚类,只是需要把你的MSE数据转换成模型要求的格式就行,下面我一步步给你讲清楚怎么做:
步骤1:读取并预处理数据
首先用pandas读取你的CSV文件,提取出MSE列。这里要注意:sklearn的K-Means模型要求输入是**形状为(n_samples, n_features)**的二维数组,而单独一列MSE是一维的,所以我们需要用reshape(-1, 1)把它转换成二维格式。
import pandas as pd from sklearn.cluster import KMeans # 替换成你的CSV文件路径 df = pd.read_csv('your_mse_data.csv') # 提取MSE列,转换为K-Means要求的二维数组格式 X = df['mse'].values.reshape(-1, 1)
步骤2:执行K-Means聚类(分成2个簇)
接下来初始化K-Means模型,设置簇数n_clusters=2,然后拟合数据,就能得到每个MSE值对应的簇标签,以及两个簇的均值中心。
# 初始化模型,设置随机种子保证结果可复现 kmeans = KMeans(n_clusters=2, random_state=42) # 拟合数据并给每个样本分配簇标签 df['cluster_label'] = kmeans.fit_predict(X) # 获取两个簇的MSE均值(flatten把二维数组转成一维方便查看) cluster_means = kmeans.cluster_centers_.flatten()
步骤3:查看聚类结果
现在你的DataFrame里多了cluster_label列(标记每个数据属于簇0还是簇1),cluster_means则是两个簇的平均MSE值。可以直接打印查看:
print("带簇标签的完整数据:") print(df[['date', 'mse', 'cluster_label']]) print("\n两个簇的MSE均值:") print(f"簇0的平均MSE: {cluster_means[0]:.2f}") print(f"簇1的平均MSE: {cluster_means[1]:.2f}")
可选:可视化聚类结果
为了更直观地看到聚类效果,你可以用matplotlib绘制散点图,同时标出两个簇的均值线:
import matplotlib.pyplot as plt plt.figure(figsize=(10, 6)) # 按簇分组绘制散点 for cluster in df['cluster_label'].unique(): cluster_data = df[df['cluster_label'] == cluster] plt.scatter(cluster_data['date'], cluster_data['mse'], label=f'Cluster {cluster}', alpha=0.7) # 绘制簇均值的虚线 for idx, mean_val in enumerate(cluster_means): plt.axhline(y=mean_val, color=f'C{idx}', linestyle='--', label=f'Cluster {idx} Mean: {mean_val:.2f}') plt.xticks(rotation=45) plt.xlabel('Date') plt.ylabel('MSE') plt.title('K-Means Clustering of MSE Values (2 Clusters)') plt.legend() plt.tight_layout() plt.show()
简单补充下:这里我们并没有用到Y值,因为K-Means是无监督聚类算法,不需要标签输入——你只需要把要聚类的特征(这里就是MSE)作为X输入给模型就行,转成二维格式只是为了适配sklearn的API要求。
内容的提问来源于stack exchange,提问作者Souvik Ray
相关产品推荐
相关产品推荐

