Python中KMeans簇数为2时生成所有特征组合计算聚类质心的方法
实现方法
前置逻辑
KMeans聚类仅支持数值型输入,你的数据集里Brand是文本类列,需要先排除出可参与聚类的特征池,剩下的可参与特征为Price、sales、Export、Speed共4个数值列。
要遍历所有可能的特征组合,本质是从4个特征里取所有非空的无重复子集,不需要手动枚举所有组合,用itertools.combinations就能批量生成。
可直接运行的代码
import pandas as pd from itertools import combinations from sklearn.cluster import KMeans # 初始化原始数据集 cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'], 'Price': [22000,25000,27000,35000], 'sales': [220000,250000,270000,350000], 'Export': [2000,2000,7000,5000], 'Speed': [220,210,270,350] } df = pd.DataFrame(cars, columns = ['Brand', 'Price','sales','Export','Speed']) # 1. 提取所有可用于聚类的数值特征 numeric_features = df.select_dtypes(include='number').columns.tolist() # 2. 生成所有非空的特征组合 all_combos = [] # 依次遍历1个特征、2个特征...直到全部特征的组合长度 for combo_length in range(1, len(numeric_features)+1): for combo in combinations(numeric_features, combo_length): all_combos.append(combo) # 3. 遍历每个特征组合,运行簇数=2的KMeans,提取结果 result_store = {} for feature_set in all_combos: # 取当前特征集对应的训练数据 X = df[list(feature_set)] # 固定随机种子保证结果可复现 kmeans_model = KMeans(n_clusters=2, random_state=42) kmeans_model.fit(X) # 提取当前组合的聚类质心 current_centroids = pd.DataFrame(kmeans_model.cluster_centers_, columns=feature_set) # 给原始数据集添加当前特征集对应的聚类标签列 label_col = f'label_{"_".join(feature_set)}' df[label_col] = kmeans_model.labels_ # 存储当前组合的结果方便后续调用 result_store[feature_set] = { 'centroids': current_centroids, 'trained_model': kmeans_model }
关键说明
- 总共会生成15组特征组合,分别对应1个特征、2个特征、3个特征、4个特征的所有可能搭配,不会出现重复组合。
- 代码里设置
random_state=42是为了消除KMeans初始质心随机带来的结果波动,保证每次运行输出的质心、标签完全一致。 - 由于原始特征量纲差异极大(比如
sales量级为1e6,Speed量级为1e2),如果需要获得更合理的聚类效果,可以在模型训练前对输入特征做标准化处理,避免大量级特征主导聚类结果。 - 你可以直接通过
result_store[你的目标特征组合]['centroids']查看对应组合下的聚类质心,通过df新增的label列查看每条样本对应的聚类标签。 - 如果需要把文本类的
Brand列纳入特征池,可以先对该列做标签编码转换为数值后,再补充到numeric_features列表里参与组合生成。
内容的提问来源于stack exchange,提问作者Qianru Song
相关产品推荐
相关产品推荐

