使用KMeans聚类时,如何为每行输出对应畸变值并添加至数据集?
给KMeans聚类的每行数据添加对应畸变值的方法
当然可以实现!你不用再按簇拆分数据来计算单个样本的畸变值,直接一次性生成和原始数据集行数匹配的距离列就好,下面是具体的实现步骤和代码:
1. 先训练你的KMeans模型
首先正常完成KMeans的训练,获取模型的簇标签和簇中心:
from sklearn.cluster import KMeans import pandas as pd import numpy as np # 假设你的原始数据集是df,feature_cols是你用来聚类的特征列 X = df[feature_cols] # 初始化并训练KMeans,这里簇数设为3,你可以根据自己的需求调整 kmeans = KMeans(n_clusters=3, random_state=42) kmeans.fit(X)
2. 计算每个样本到所属簇中心的距离(单条数据的畸变值)
核心思路是利用簇标签,给每个样本匹配对应的簇中心,然后直接计算欧氏距离:
# 获取每个样本对应的簇标签 sample_labels = kmeans.labels_ # 获取所有簇的中心坐标 centers = kmeans.cluster_centers_ # 计算每个样本到其所属簇中心的欧氏距离 # cluster_centers[sample_labels]会自动根据每个样本的标签匹配对应的簇中心 sample_distances = np.sqrt(np.sum((X - centers[sample_labels])**2, axis=1))
这里有个小验证:模型的inertia_属性是所有样本畸变值的平方和,你可以用np.sum(sample_distances ** 2)来验证,结果会和kmeans.inertia_完全一致,说明这个计算是准确的。
3. 将距离列合并到原始数据集
现在sample_distances是一个和原始数据集行数完全一致的一维数组,直接添加为新列即可:
# 给原始数据集添加新列,命名为cluster_distance(你可以自定义) df['cluster_distance'] = sample_distances # 如果你要找距离最大的样本,直接排序筛选就行 top_largest_distance_samples = df.sort_values(by='cluster_distance', ascending=False).head(10)
这样你就得到了带每个样本对应畸变值的完整数据集,不用再按簇拆分处理,找最大距离的样本也变得非常方便。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

