You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:45:01