如何基于条件获取给定数据的k个聚类均值?含MSE数据实例
解决方案
我来帮你搞定这个聚类分析的需求,用Python的pandas和scikit-learn工具就能轻松实现。下面分步骤给你演示:
1. 数据加载与初步筛选
首先我们需要把CSV文件加载进来,然后筛选出MSE小于指定阈值(比如40)的数据。这里假设你的CSV文件名为mse_data.csv:
import pandas as pd from sklearn.cluster import KMeans # 加载CSV数据 df = pd.read_csv('mse_data.csv') # 筛选MSE小于40的数据 threshold = 40 filtered_df = df[df['mse'] < threshold].copy() # 用copy避免SettingWithCopyWarning
2. 两聚类分析(获取所属聚类及聚类均值)
接下来对筛选后的MSE数据做两聚类,给每条数据打上聚类标签,再计算每个聚类的均值:
# 提取用于聚类的特征(这里只有MSE列) X = filtered_df[['mse']] # 初始化KMeans模型,设置聚类数为2 kmeans = KMeans(n_clusters=2, random_state=42) # random_state保证结果可复现 # 拟合模型并预测聚类标签 filtered_df['cluster_label'] = kmeans.fit_predict(X) # 计算每个聚类的均值 cluster_means = filtered_df.groupby('cluster_label')['mse'].mean().reset_index() cluster_means.columns = ['cluster_label', 'cluster_mean_mse'] # 输出结果 print("各数据所属聚类:") print(filtered_df[['date', 'mse', 'cluster_label']]) print("\n各聚类对应的均值:") print(cluster_means)
运行这段代码后,你会看到每条符合条件的数据都被标记了0或1的聚类标签,同时得到两个聚类的MSE均值。
3. 通用的基于条件获取k个聚类均值的方法
如果之后你需要调整阈值、聚类数,或者更换筛选条件,可以把逻辑封装成一个通用函数,方便复用:
def get_k_cluster_means(csv_path, condition, n_clusters): """ 基于指定条件筛选数据,并计算k个聚类的均值 参数: csv_path: CSV文件路径 condition: 筛选条件(比如lambda df: df['mse'] < 40) n_clusters: 聚类数量 返回: filtered_with_cluster: 带聚类标签的筛选后数据 cluster_means: 各聚类的均值统计 """ # 加载数据 df = pd.read_csv(csv_path) # 应用筛选条件 filtered_df = condition(df).copy() # 提取特征 X = filtered_df[['mse']] # 聚类 kmeans = KMeans(n_clusters=n_clusters, random_state=42) filtered_df['cluster_label'] = kmeans.fit_predict(X) # 计算聚类均值 cluster_means = filtered_df.groupby('cluster_label')['mse'].mean().reset_index() cluster_means.columns = ['cluster_label', 'cluster_mean_mse'] return filtered_df, cluster_means # 调用示例:筛选MSE<40,做3聚类 filtered_data, means = get_k_cluster_means( 'mse_data.csv', condition=lambda df: df['mse'] < 40, n_clusters=3 ) print(filtered_data[['date', 'mse', 'cluster_label']]) print(means)
这个函数可以灵活适配不同的筛选条件(比如lambda df: df['mse'].between(10, 50))和聚类数,非常实用。
注意事项
- 因为我们只用到MSE值做聚类,所以特征矩阵是单维度的,KMeans依然可以正常工作;如果有多特征的情况,只需要调整
X = filtered_df[['feature1', 'feature2']]即可。 - 设置
random_state是为了让每次运行聚类的结果一致,方便调试和对比。
内容的提问来源于stack exchange,提问作者Souvik Ray
相关产品推荐
相关产品推荐

