如何获取Dtaidistance K-means模型的SSE值与轮廓系数
解决方案:基于Dtaidistance K-means结果计算SSE与轮廓系数
计算SSE(误差平方和)
利用训练后已有的簇分配结果cluster_idx和质心km0.means,直接遍历每个簇计算样本到对应质心的DTW距离平方和即可,无需重新训练:
from dtaidistance import dtw sse = 0.0 for cluster_id, sample_indices in enumerate(cluster_idx): centroid = km0.means[cluster_id] for idx in sample_indices: # 获取当前样本并计算到质心的DTW距离 dist = dtw.distance(x_red[idx], centroid) sse += dist ** 2 print(f"SSE值: {sse:.4f}")
计算Silhouette Score(轮廓系数)
需要先把簇分配结果转换为每个样本对应的标签数组,再结合sklearn的silhouette_score函数,传入DTW作为自定义距离度量:
from sklearn.metrics import silhouette_score import numpy as np # 将cluster_idx转换为全局标签数组 labels = np.zeros(len(x_red), dtype=int) for cluster_id, sample_indices in enumerate(cluster_idx): labels[sample_indices] = cluster_id # 定义适配sklearn的DTW距离函数 def dtw_metric(a, b): return dtw.distance(a, b) # 计算轮廓系数 sil_score = silhouette_score(x_red, labels, metric=dtw_metric) print(f"轮廓系数: {sil_score:.4f}")
注意事项
- 针对大规模数据集,使用自定义
metric参数的方式会按需计算距离,避免生成完整距离矩阵占用过多内存; - 所有计算都复用训练后的已有结果,完全无需重新执行K-means训练流程。
内容的提问来源于stack exchange,提问作者hrdmean
相关产品推荐
相关产品推荐

