





















本章会介绍用于评估聚类模型的指标SC系数和CH系数,并解释其为什么可以用于聚类模型的评估
轮廓系数法同时考虑簇内的内聚程度(Cohesion)与簇间的分离程度(Separation),具体计算过程如下:
\[S = \frac{b-a}{\max(a,b)} \]
CH 系数综合考虑簇内的内聚程度、簇外的离散程度以及聚类质心的个数。
优化目标:类别内部数据的距离平方和越小越好,类别之间的距离平方和越大越好,聚类的类别数量越少越好。
\[\text{CH}(k) = \frac{SSB}{SSW} \cdot \frac{m-k}{k-1} \]
\[SSW = \sum_{i=1}^{m} \left\| x_i - C_{pi} \right\|^2 \]
\[SSB = \sum_{j=1}^{k} n_j \left\| C_j - \bar{X} \right\|^2 \]
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_score
def dm02_sc():
# 1. 定义sc列表,记录:每个K值的sc值
sc_list = []
# 2.生成数据集. 参1:样本数量;参2:特征数量;参3:4个簇;参4:标准差
x,y = make_blobs(
n_samples=1000,
n_features=2,
centers=[[-1,-1],[0,0],[1,1],[2,3]],
cluster_std=[0.4,0.2,0.2,0.2],
random_state=23
)
# 3.for 训练遍历,获取到每个K值,计算其对应的sc值,并添加到sc_list列表中
for k in range(2,100): #考虑簇外,至少两个簇
# 3.1 创建Kmeans对象.参1:簇的数量;参2:最大迭代次数;参3:固定的随机数种子
estimator = KMeans(n_clusters=k,max_iter=100,random_state=23)
# 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 绘制折线图
# 参1:k值;参2:该k值对应的sc值
plt.plot(range(2,100),sc_list)
# 4.7 显示图像
plt.show()
dm02_sc()
def dm03_ch():
# 1. 定义ch列表,记录:每个K值的ch值
ch_list = []
# 2.生成数据集. 参1:样本数量;参2:特征数量;参3:4个簇;参4:标准差
x,y = make_blobs(
n_samples=1000,
n_features=2,
centers=[[-1,-1],[0,0],[1,1],[2,3]],
cluster_std=[0.4,0.2,0.2,0.2],
random_state=23
)
# 3.for 训练遍历,获取到每个K值,计算其对应的ch值,并添加到ch_list列表中
for k in range(2,100): #考虑簇外,至少两个簇
# 3.1 创建Kmeans对象.参1:簇的数量;参2:最大迭代次数;参3:固定的随机数种子
estimator = KMeans(n_clusters=k,max_iter=100,random_state=23)
# 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 绘制折线图
# 参1:k值;参2:该k值对应的ch值
plt.plot(range(2,100),ch_list)
# 4.7 显示图像
plt.show()
dm03_ch()
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。