如何为Excel表中2000组坐标/欧氏距离计算Silhouette系数并实现K-Means聚类
完整操作步骤
1. 数据预处理
- 先整理Excel表格数据:如果是位置坐标,确保每一行对应1组样本,每一列对应1个坐标维度(比如二维坐标就是X、Y两列),删除空行、异常值,仅保留纯数值数据;如果存储的是欧氏距离矩阵,确认是2000×2000的对称矩阵格式即可。
- 把整理完成的数据导出为
csv格式,避免Excel专有格式的兼容性问题。
2. 用轮廓系数确定最佳聚类数K
轮廓系数取值范围为[-1,1],数值越接近1代表聚类效果越好,我们可以遍历候选K值,选得分最高的K作为最终聚类数。以下是Python实现代码,需要提前安装pandas、numpy、scikit-learn依赖库:
import pandas as pd import numpy as np from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score # 读取数据:原始坐标版本 data = pd.read_csv("你的数据文件路径.csv").values # 如果是预计算的距离矩阵,替换为下面的读取代码 # dist_matrix = pd.read_csv("你的距离矩阵文件路径.csv").values # 设定K的候选范围,2000组样本建议取值为2~15 sil_score_list = [] k_candidate = range(2, 16) for k in k_candidate: kmeans_model = KMeans(n_clusters=k, random_state=42) labels = kmeans_model.fit_predict(data) # 距离矩阵版本替换为:labels = kmeans_model.fit_predict(dist_matrix) # 计算轮廓系数:原始坐标版本 sil_score = silhouette_score(data, labels, metric="euclidean") # 距离矩阵版本替换为:sil_score = silhouette_score(dist_matrix, labels, metric="precomputed") sil_score_list.append(sil_score) # 提取得分最高的K作为最佳聚类数 best_k = k_candidate[np.argmax(sil_score_list)] print(f"最佳聚类数为:{best_k}")
提示:如果计算速度太慢,可以给
silhouette_score加sample_size=500参数,随机抽取部分样本计算,不影响结果准确性。
3. 基于最佳K值执行K-Means聚类
# 用最佳K值训练模型 final_kmeans = KMeans(n_clusters=best_k, random_state=42) cluster_result = final_kmeans.fit_predict(data) # 距离矩阵版本替换为:cluster_result = final_kmeans.fit_predict(dist_matrix) # 合并原始数据和聚类标签导出为Excel output_df = pd.DataFrame(data, columns=[f"维度{i+1}" for i in range(data.shape[1])]) output_df["聚类标签"] = cluster_result output_df.to_excel("聚类结果输出.xlsx", index=False)
最终输出的Excel文件中,聚类标签列相同数值的样本属于同一个聚类分组。
注意事项
- 如果原始坐标不同维度的量纲差异较大,需要先做标准化处理再计算,避免维度权重偏差。
- K-Means本身是随机初始化聚类中心的,设置
random_state=42是为了保证每次运行结果一致。
内容的提问来源于stack exchange,提问作者Sudeesh
相关产品推荐
相关产品推荐

