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