聚类算法评估指标_ SC系数与CH系数代码实现

发布时间:2026/7/5 5:06:06

聚类算法评估指标_ SC系数与CH系数代码实现 一、SC轮廓系数法Silhouette Coefficient轮廓系数法同时考虑簇内的内聚程度(Cohesion)与簇间的分离程度(Separation)具体计算过程如下计算每一个样本 到同簇内其他样本的平均距离 该值越小代表簇内样本相似度越高。计算每一个样本 到最近其他簇 内所有样本的平均距离 该值越大代表该样本越不容易被误分到其他簇。通过公式计算单个样本的轮廓系数−max(,)取全部样本轮廓系数的平均值作为整体聚类效果评估指标。轮廓系数取值范围[−1,1]SC数值越接近1代表聚类效果越好。参数说明样本到自身簇内其余样本的平均距离样本到所有其他簇平均距离中的最小值我们希望越小越好簇内样本接近越大越好各簇之间样本远离当变大时变大当变小时变小。二、CH系数Calinski-HarabaszCH 系数综合考虑簇内的内聚程度、簇外的离散程度以及聚类质心的个数。优化目标类别内部数据的距离平方和越小越好类别之间的距离平方和越大越好聚类的类别数量越少越好。1.计算公式CH()⋅−−1∑1‖−‖2∑1‖−¯‖2SSW簇内距离等价于SSE当前样本所属簇的质心单个样本含义所有样本点到自身簇质心的距离平方累加和用来衡量簇内的内聚程度指标特性 越小簇内样本越紧密聚类效果越好SSB簇间距离第个簇的质心¯全部样本的全局均值第个簇内的样本数量含义衡量不同簇之间的分离程度指标特性 越大簇与簇之间区分越明显参数说明总样本数量聚类质心簇的个数越小说明各簇之前越接近CH系数越大 越大相当于各簇之前越离散CH系数越大K越小CH也会变大因此我们希望寻找CH更大的模型。CH系数评价规则CH系数数值越大代表簇内越紧凑、簇间越分散整体聚类效果越优。三、代码实现导入相关的库import os os.environ[OMP_NUM_THREADS] 4 # 设置OMP程序运行时使用的线程数 from sklearn.cluster import KMeans import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.metrics import calinski_harabasz_score,silhouette_score1.定义函数演示SC轮廓系数法def dm02_sc(): # 1. 定义sc列表记录每个K值的sc值 sc_list [] # 2.生成数据集. 参1样本数量参2特征数量参34个簇参4标准差 x,y make_blobs( n_samples1000, n_features2, centers[[-1,-1],[0,0],[1,1],[2,3]], cluster_std[0.4,0.2,0.2,0.2], random_state23 ) # 3.for 训练遍历获取到每个K值计算其对应的sc值并添加到sc_list列表中 for k in range(2,100): #考虑簇外至少两个簇 # 3.1 创建Kmeans对象.参1簇的数量参2最大迭代次数参3固定的随机数种子 estimator KMeans(n_clustersk,max_iter100,random_state23) # 3.2 训练模型 estimator.fit(x) # 3.3 模型预测 y_pred estimator.predict(x) # 3.4 获取每个簇的sc值 sc_value silhouette_score(x,y_pred) # 3.5 将每个k值对应的sc值添加到sc_list列表中 sc_list.append(sc_value) # 4.绘制sc曲线--数据可视化 # 4.1 创建画布指定画布的尺寸 plt.figure(figsize(20,10)) # 4.2 设置标题 plt.title(sc value) # 4.3 设置x的刻度 plt.xticks(range(2,100,3)) # 4.4 添加x轴y轴的标签 plt.xlabel(k) plt.ylabel(sc) # 4.5 绘制网格 plt.grid() # 4.6 绘制折线图 # 参1k值参2该k值对应的sc值 plt.plot(range(2,100),sc_list) # 4.7 显示图像 plt.show() dm02_sc()2.定义函数演示ch轮廓系数法def dm03_ch(): # 1. 定义ch列表记录每个K值的ch值 ch_list [] # 2.生成数据集. 参1样本数量参2特征数量参34个簇参4标准差 x,y make_blobs( n_samples1000, n_features2, centers[[-1,-1],[0,0],[1,1],[2,3]], cluster_std[0.4,0.2,0.2,0.2], random_state23 ) # 3.for 训练遍历获取到每个K值计算其对应的ch值并添加到ch_list列表中 for k in range(2,100): #考虑簇外至少两个簇 # 3.1 创建Kmeans对象.参1簇的数量参2最大迭代次数参3固定的随机数种子 estimator KMeans(n_clustersk,max_iter100,random_state23) # 3.2 训练模型 estimator.fit(x) # 3.3 模型预测 y_pred estimator.predict(x) # 3.4 获取每个簇的ch值 ch_value calinski_harabasz_score(x,y_pred) # 3.5 将每个k值对应的ch值添加到ch_list列表中 ch_list.append(ch_value) # 4.绘制ch曲线--数据可视化 # 4.1 创建画布指定画布的尺寸 plt.figure(figsize(20,10)) # 4.2 设置标题 plt.title(ch value) # 4.3 设置x的刻度 plt.xticks(range(2,100,3)) # 4.4 添加x轴y轴的标签 plt.xlabel(k) plt.ylabel(ch) # 4.5 绘制网格 plt.grid() # 4.6 绘制折线图 # 参1k值参2该k值对应的ch值 plt.plot(range(2,100),ch_list) # 4.7 显示图像 plt.show() dm03_ch()

相关新闻