核心思想
Kmeans是一个无监督的问题,想要达到的目标是把数据聚成k类。在说算法之前必须说一下Kmeans的理论基础,也就是能够进行Kmeans操作的前提是每一个簇中的数据都服从高斯分布,也就是说数据是服从混合高斯模型的,而且假设每一个高斯模型的方差都是相同的,这样才能够保证结果是正确的,即对于每一个点的概率如下,
x
i
∼
N
(
μ
i
,
σ
)
x_i \sim N(\mu_i, \sigma)
xi∼N(μi,σ)
而对于所有的数据,它的似然概率为:
∏
j
=
1
K
∏
i
=
1
N
j
(
1
2
π
σ
e
−
(
x
j
i
−
μ
j
)
2
2
σ
2
)
\prod_{j=1}^{K}\prod_{i=1}^{N_j}(\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x_{ji}-\mu_j)^2}{2\sigma^2}})
j=1∏Ki=1∏Nj(2πσ1e−2σ2(xji−μj)2)
要想上述取值最大,取log再取符号就得让如下公式最小,
∑
j
=
1
K
∑
i
=
1
N
j
(
x
j
i
−
μ
j
)
2
\sum_{j=1}^{K}\sum_{i=1}^{N_j}(x_{ji}-\mu_j)^2
j=1∑Ki=1∑Nj(xji−μj)2
而求解的结果为
μ
j
=
1
N
j
∑
i
=
1
N
j
x
j
i
\mu_j = \frac{1}{N_j}\sum_{i=1}^{N_j}x_{ji}
μj=Nj1i=1∑Njxji
这正是Kmeans的原理所在,因而如下的每一步的类别中心都是一个类中数据的几何平均,这样才能保证似然概率最大。
模型概述
首先随机选择k个样本作为初始k个类的中心,之后计算每个样本到这k个中心的距离,取最小距离的那个类作为这个样本的标记,这样就会得到一个初始化的聚类,之后把每一个类的所有样本的几何中心作为这一类的新的中心,之后再去计算每个样本点到新中心的距离,如果达到某种停止条件(MSE或者迭代次数),则终止操作,否则接着重复上述过程直到达到停止条件。整个过程类似EM算法,流程如下:
E步:确定k个类中心后,计算出每个样本的所属类别。
M步:利用每一类样本求出新的类中心。
Kmeans缺点
- 初始值选取很敏感。
- 只适用于簇呈圆球状,对于带状或者条状的分布是无效的,这是由于它的概率假设导致的。
- K值需要预先设定。
Kmeans++
由于Kmeans对初始值的选取是很敏感的,因而需要单独对初值的选取做文章,因而有了Kmeans++。
首先选择一个样本作为第一个簇中心,之后再计算其他样本到这个样本的距离,并且给其他样本赋权重(距离越大权重越大),而后在这些样本中选择一个样本作为下一个簇的中心,权重越大选到的概率越大。
选择一个数据作为第二个簇中心,而后再来计算剩下的样本到其最近簇中心的距离,距离越大权重越大,之后再随机选择一个样本作为第三个簇中心,这样反复选出k个数据就选取好了k个初始值,最核心的问题是如何实现权重越大,选取的概率越高这一实现。
首先计算每个点到最近簇的距离,放到一个数组中,而后把所有的距离都加起来,得到sum(D(x)), 而后用sum(D(x))乘以一个[0, 1)的随机数, 即sum(D(x))*random=Random, 之后从左向右遍历之前计算好的距离数组,每遍历一个元素,Random-=D(x), 直到Random小于等于0,这时选取当前元素作为新的簇中心。
Kmeans和KNN的区别
KNN
- 分类算法
- 监督学习
- 数据集是带Label的数据
- 没有明显的训练过程
- K值含义 - 要给一个样本X赋予类别标签,从数据集中在X附近找离它最近的K个数据点,将它划分为归属于类别最多的一类。
Kmeans
- 聚类算法
- 非监督学习
- 数据集是无Label,杂乱无章的数据
- 有明显的训练过程
- K值含义- K是事先设定的数字,将数据集分为K个簇,需要依靠人的先验知识