算法概述
K-means算法也称为K_均值算法,用于聚类算法。聚类是一种无监督学习,他将相似的对象归于一个簇中,簇中心通过簇中所有点的均值来计算。聚类算法与分类算法的主要区别就是分类的目标类别已知,而聚类的目标类别未知。
簇:所有数据点的点集合,簇中的对象是相似的
质心:簇中所有点的中心(由簇中所有点的均值求得)
SSE:Sum of Sqared Error 平方误差和,SSE越小表示越接近质心
算法原理
误差平方和SSE用来衡量K-means算法的好坏
S
S
E
=
∑
i
=
1
k
∑
X
∈
C
i
(
C
i
−
X
)
2
SSE=\begin{matrix} \sum_{i=1}^k \end{matrix}\begin{matrix} \sum_{X \in C_i}(C_i-X)^2\end{matrix}
SSE=∑i=1k∑X∈Ci(Ci−X)2C为聚类中心,X为簇中数据点
∂
S
S
E
∂
C
k
=
∂
∂
C
k
∑
i
=
1
k
∑
X
∈
C
i
(
C
i
−
X
)
2
\frac{\partial SSE}{\partial C_k}=\frac{\partial }{\partial C_k}\begin{matrix} \sum_{i=1}^k \end{matrix}\begin{matrix} \sum_{X \in C_i}(C_i-X)^2\end{matrix}
∂Ck∂SSE=∂Ck∂∑i=1k∑X∈Ci(Ci−X)2
=
∑
i
=
1
k
∑
X
∈
C
i
∂
∂
C
k
(
C
i
−
X
)
2
=\begin{matrix} \sum_{i=1}^k \end{matrix}\begin{matrix} \sum_{X \in C_i}\end{matrix}\frac{\partial }{\partial C_k}(C_i-X)^2
=∑i=1k∑X∈Ci∂Ck∂(Ci−X)2
=
∑
X
∈
C
i
2
(
C
i
−
X
)
=\begin{matrix} \sum_{X \in C_i}\end{matrix}2(C_i-X)
=∑X∈Ci2(Ci−X)令
∑
X
∈
C
i
2
(
C
i
−
X
)
=
0
\begin{matrix} \sum_{X \in C_i}\end{matrix}2(C_i-X)=0
∑X∈Ci2(Ci−X)=0,得:
m
i
C
i
=
∑
X
∈
C
i
X
m_iC_i=\begin{matrix} \sum_{X \in C_i}\end{matrix}X
miCi=∑X∈CiX
C
i
=
1
m
i
∑
X
∈
C
i
X
C_i=\frac{1}{m_i}\begin{matrix} \sum_{X \in C_i}\end{matrix}X
Ci=mi1∑X∈CiX
由推导可以看出,当质心为簇中数据均值时,SSE最小
算法推导
算法流程
1、随机给出k个初始聚类中心
2、repeat:
把每一个数据对象重新分配到k个聚类中心处,形成k个簇 重新计算每一个簇的聚类中心
3、until 聚类中心不在发生变化(簇内样本点不改变)
K值的确定
1.手肘法
随着聚类数k的增大,样本划分的更加精细,那么平方误差和SSE会逐渐变小
S
S
E
=
∑
i
=
1
k
∑
X
∈
C
i
(
C
i
−
X
)
2
SSE=\begin{matrix} \sum_{i=1}^k \end{matrix}\begin{matrix} \sum_{X \in C_i}(C_i-X)^2\end{matrix}
SSE=∑i=1k∑X∈Ci(Ci−X)2
但K值太大聚类的效果不怎好,SSE的下降也逐渐变小特点当K值小于真实聚类数时,K值的增大对聚类效果产生的影响很大,SSE的下降幅度也很大;
当K值大于真实聚类数时,K值的增大对聚类效果产生的影响很小,SSE的下降幅度也很小;
呈现出来的图像是先下降的很快,后平缓,在其邻接的地方图像上呈现为手肘状,因此形象的称其为手肘法。
初始化质心
随机初始化质心可能导致算法的迭代次数增加,K-means++是对K-means随机选取质心的一个优化具体步骤如下:
1.随机选取一个点作为第一个聚类的中心
2.计算所有样本与第一个聚类中心的距离
3.选择上一步中距离最大的点作为第二个聚类中心
4.迭代:计算所有点到与之最近的聚类中心的距离,选取最大距离的点作为新的聚类中心
5.直到选出来这K个点,结束迭代
k-means算法不会陷入一直改变质心的循环之中,最终的质心一定是确定的