Kmeans聚类算法
1、概述
是一种无监督学习算法,根据样本之间的相似性将样本划分到不同的类别中,不同的相似度计算方式,会得到不同的聚类结果,常用的相似度计算方式有欧式距离。
目的是在没有先验条件知识的情况下,自动发现数据集中的内在结构和模式。
使用不同的聚类准则,产生的聚类结果不同。
2、算法分类
- 根据聚类颗粒度分类:
- 细聚类
- 粗聚类
- 根据实现方法分类:
- K-means:根据质心分类,主要介绍K-means,通用普遍
- 层次聚类:对数据进行逐层划分,直到达到聚类的类别个数
- DBSCAN聚类是一种基于密度的聚类算法
- 谱聚类是一类基于图论的聚类算法
3、相关api
导包:
sklearn.cluster.KMeans # Kmeans依赖包
sklearn.datasets.make_blobs # 生成数据
执行:
# 1.导入工具包
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# calinski_harabaz_score CH系数,分数越高,聚类效果越好
from sklearn.metrics import calinski_harabasz_score
# 2.构建数据集 1000个样本,每个样本2个特征 4个质心蔟数据标准差[0.4, 0.2, 0.2, 0.2]
x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]],cluster_std = [0.4, 0.2, 0.2, 0.2], random_state=22)
plt.figure()
plt.scatter(x[:, 0], x[:, 1], marker='o')
plt.show()
# 3.使用k-means进行聚类
y_pred = KMeans(n_clusters=3, random_state=22).fit_predict(x)
# 4.展示聚类效果
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()
# 5.模型评估, 使用CH方法评估
print(calinski_harabasz_score(x, y_pred))
4、批判指标
(一)、SSE-误差平方和
(1)、定义
S S E = ∑ i = 1 k ∑ p ∈ C i ∣ p − m i ∣ 2 K 表示聚类中心的个数 C i 表示簇 p 表示样本 m i 表示簇的质心 SSE=\sum_{i=1}^k\sum_{p\in C_i}|p-m_i|^2\\ K表示聚类中心的个数\\ C_i表示簇\\ p表示样本\\ m_i表示簇的质心 SSE=i=1∑kp∈Ci∑∣p−mi∣2K表示聚类中心的个数Ci表示簇p表示样本mi表示簇的质心
SSE的值越小,说明数据点越靠近它们的中心,聚类效果越好。
(2)、相关api
kmeans对象.inertia_ # 获得SSE的值
(二)、SC系数
(1)、定义
结合了聚类的凝聚度(cohesion)和分离度(separation)
S
=
b
−
a
m
a
x
(
a
,
b
)
a
:样本
i
到同一簇内其他点不相似程度的平均值
b
:样本
i
到其他簇的平均不相似程度的最小值
S=\frac{b-a}{max(a,b)}\\ a:样本i到同一簇内其他点不相似程度的平均值\\ b:样本i到其他簇的平均不相似程度的最小值
S=max(a,b)b−aa:样本i到同一簇内其他点不相似程度的平均值b:样本i到其他簇的平均不相似程度的最小值
-
计算每一个样本 i 到同簇内其他样本的平均距离 ai,该值越小,说明簇内的相似程度越大
-
计算每一个样本 i 到最近簇 j 内的所有样本的平均距离 bij,该值越大,说明该样本越不属于其他簇 j
-
计算所有样本的平均轮廓系数
-
轮廓系数的范围为:[-1, 1],值越大聚类效果越好
(2)、相关api
silhouette_score(x, y_predict) # 获取SC系数,传x和y预测值
(三)、CH系数
(1)、定义
CH 系数结合了聚类的凝聚度(Cohesion)和分离度(Separation)、质心的个数,希望用最少的簇进行聚类。
C
H
(
k
)
=
S
S
B
S
S
W
m
−
k
k
−
1
S
S
W
=
∑
i
=
1
m
∣
∣
x
i
−
C
p
i
∣
∣
2
C
p
i
表示质心
x
i
表示某个样本
m
表示样本数量
k
表示质心个数
S
S
B
=
∑
i
=
1
k
n
j
∣
∣
C
j
−
X
‾
∣
2
c
j
表示质心
X
‾
表示质心与质心之间的中心点
n
j
表示样本的个数
CH(k)=\frac{SSB}{SSW}\frac{m-k}{k-1}\\ SSW=\sum_{i=1}^m||x_i-C_{pi}||^2\\ C_{pi}表示质心\\ x_i表示某个样本\\ m表示样本数量\\ k表示质心个数\\ SSB=\sum_{i=1}^kn_j||C_j-\overline{X}|^2\\ c_j表示质心\\ \overline{X}表示质心与质心之间的中心点\\ n_j表示样本的个数
CH(k)=SSWSSBk−1m−kSSW=i=1∑m∣∣xi−Cpi∣∣2Cpi表示质心xi表示某个样本m表示样本数量k表示质心个数SSB=i=1∑knj∣∣Cj−X∣2cj表示质心X表示质心与质心之间的中心点nj表示样本的个数
SSW值是计算每个样本点到质心的距离再累加起来,表示的是簇内的内聚程度,SSW越小越好
SSB表示簇与簇之间的分离度,SSB越大越好
(2)、相关api
calinski_harabasz_score(x, y_predict) # 获取CH系数,传x和y预测值
(四)、肘部法
肘部法通过SSE确定n_culsters的值
-
对于n个点的数据集,迭代计算k(from 1 to n),每次聚类完成后计算SSE
-
SSE是会逐渐变小的,以为每个点都是在它所在簇的中心本身
-
SSE变化过程中会出现一个拐点,下降率突然变缓时认为时最佳n_culsters
-
在决定什么时候停止训练时,肘形判据同样有效,数据通常有更多的噪音,在增加分类无法带来更多回报时,我们停止增加类别