监督学习:
训练集:{(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))}{(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))}
针对一组有标记的训练数据,提出一个适当的假设,找出决策边界,借此区分正负标记数据。
无监督学习:
训练集:{x(1),x(2),⋯,x(m)}{x(1),x(2),⋯,x(m)}
面对一组无标记的训练数据,数据之间不具有任何相关联的标记,将未标记的数据送入特定的算法,分析出数据的结构,例如聚类。
KK均值()算法是现在最为广泛使用的聚类算法。
有一些未标记的数据如下图所示,想将这些数据分成两个簇
首先随机选择两个点,称为聚类中心:
KK均值算法是一个迭代方法,做两件事:
- 簇分配,即遍历所有的样本,依据每个点更接近哪个中心,来将数据点分配到不同的聚类中心,如下图:
- 移动聚类中心,将聚类中心移动到该类所有点的均值处,如下图:
循环以上两步,得到如下图结果:
当聚类中心不再变化时,均值算法收敛。KK均值算法接受两个输入:
- 参数(表示聚类簇的个数);
- 训练集{x(1),x(2),⋯,x(m)}{x(1),x(2),⋯,x(m)},x(i)∈Rnx(i)∈Rn是个nn维向量。
算法说明:
随机初始化个聚类中心μ1,μ2,⋯,μK∈Rnμ1,μ2,⋯,μK∈Rn
Repeat{Repeat{
for i= 1 to mfor i= 1 to m
c(i):=c(i):=距样本x(i)x(i)最近的聚类中心的索引(1∼K1∼K)
注:mink∥x(i)−μk∥→c(i)=kmink‖x(i)−μk‖→c(i)=k
for k= 1 to Kfor k= 1 to K
μk:=μk:=分配到第kk个簇的所有点的平均值
例:c(1)=2,c(5)=2,c(6)=2,c(10)=2c(1)=2,c(5)=2,c(6)=2,c(10)=2
则μ2=14[x(1)+x(5)+x(6)+x(10)]μ2=14[x(1)+x(5)+x(6)+x(10)]
}}
如果存在一个没有点分配给它的聚类中心,直接将该中心移除。 - 参数(表示聚类簇的个数);
- 确保K<mK<m,KK为类别数,为训练样本数;
- 随机选取KK个训练样本;
- 令等于这KK个训练样本,表示KK个聚类中心。
我们用μc(i)μc(i)表示样本x(i)x(i)被分配到的簇的聚类中心。
KK均值算法的优化目标:
minc(1),⋯,c(m)μ1,⋯,μKJ(c(1),⋯,c(m),μ1,⋯,μK)minc(1),⋯,c(m)μ1,⋯,μKJ(c(1),⋯,c(m),μ1,⋯,μK)
上面这个代价函数也叫失真代价函数。
在KK均值算法中:
第一步
c(i):=c(i):=距样本x(i)x(i)最近的聚类中心的索引(1∼K1∼K)
实际是在对代价函数进行关于参数c(1),⋯,c(m)c(1),⋯,c(m)的最小化,保持μ1,⋯,μKμ1,⋯,μK不变。
第二步
for k= 1 to Kfor k= 1 to K
μk:=μk:=分配到第kk个簇的所有点的平均值
实际上是选择最小化代价函数的。
随机初始化聚类中心的方法:
因为随机初始化的不同,均值算法最终可能会得到不同的结果,只得到局部最优解。
假设存在数据如下图:
其全局最优解为:
由于随机初始化的不同,可能得到如下两种局部最优解:
如果想提高KK均值算法找到全局最优解的几率,能做的是尝试多次随机初始化,运行多次均值算法。
具体做法如下:
for i= 1 to 100for i= 1 to 100
{{
随机初始化KK均值;
运行KK均值算法,得到;
计算代价函数J(c(1),⋯,c(m),μ1,⋯,μK)J(c(1),⋯,c(m),μ1,⋯,μK)
}}
选取J(c(1),⋯,c(m),μ1,⋯,μK)J(c(1),⋯,c(m),μ1,⋯,μK)最小的聚类。
实际证明:若KK较小(),做多次随机初始化通常能保证找到一个较好的局部最优解,但若KK非常大时,做多次随机初始化不太会有太大影响,可能会有稍好的结果,但不会好太多。
如何决定聚类数?
最常用的方法:通过看可视化的图或者看聚类算法的输出结果手动决定聚类的数目。
肘部法则():
计算KK取不同值时的代价函数,用图表呈现,如下图:
找到拐点,即K=3K=3处,则类别数取33。
但是,实际中经常得到的结果为下图:
没有清晰的肘点,畸变值是连续下降的。
所以肘部法则值得尝试,但不是在任何问题上都有好的表现。
还有一种考虑值的方法:看不同的聚类数量能为后续目标提供多好的结果。