1. 无监督学习
无监督学习:数据不带有任何标签,训练集只有x而没有对应的label
聚类:如下图中数据,可以看为两个分开的点集,用聚类算法可以找到圈出这两个点集的方法
2. K-均值算法
2.1 什么是kmeans
K-均值算法是最常用的聚类算法,算法可以将未标记的数据集聚类成不同组。
假设要将数据聚类成k个组,则方法为:
- 首先选择k个点,即聚类中心
- 求每个数据点距离k个中心的距离,并且将距离最近的的中心点与之关联,形成k个聚类组
- 计算每一个组的平均值,并将每个组的聚类中心移动到平均值的位置
- 重复上面两部直至中心点不再变化
伪代码如下:
随机初始化聚类中心
whilr true:
# 分类
for i in range(m):
c(i) = 与x(i)最接近的聚类中心点序号(1-k)
# 移动聚类中心
for j in range(K):
u(k) = 该簇数据的平均值
2.2 K-均值的优化目标
与逻辑回归等相同,K-均值算法也有自己的目标优化函数,k均值的代价函数(失真代价函数Distortion function):
J
(
c
(
1
)
,
⋯
 
,
c
(
m
)
,
μ
1
,
⋯
 
,
μ
k
)
=
1
m
∑
i
=
1
m
∣
X
(
i
)
−
μ
c
(
i
)
∣
2
J(c^{(1)},\cdots,c^{(m)},\mu_1,\cdots,\mu_k)=\frac{1}{m}\sum_{i=1}^{m}{|X^{(i)}-\mu_{c^{(i)}}|}^2
J(c(1),⋯,c(m),μ1,⋯,μk)=m1i=1∑m∣X(i)−μc(i)∣2
其中
c
(
i
)
c^{(i)}
c(i):表示当前样本x(i)所属的那个簇的序号
μ
k
\mu_k
μk:第k个聚类中心的位置
μ
c
(
i
)
\mu_{c^{(i)}}
μc(i):x(i)所属的那个簇的聚类中心的位置
则k均值算法就是找到参数使得代价函数最小:
min
(
c
(
1
)
,
⋯
 
,
c
(
m
)
,
μ
1
,
⋯
 
,
μ
k
)
J
(
c
(
1
)
,
⋯
 
,
c
(
m
)
,
μ
1
,
⋯
 
,
μ
k
)
\min_{(c^{(1)},\cdots,c^{(m)},\mu_1,\cdots,\mu_k)}J(c^{(1)},\cdots,c^{(m)},\mu_1,\cdots,\mu_k)
(c(1),⋯,c(m),μ1,⋯,μk)minJ(c(1),⋯,c(m),μ1,⋯,μk)
基于k均值算法的代价函数,在上面的伪代码中,第一个循环就是用于减小 c ( i ) c^{(i)} c(i)引起的代价,第二个循环移动聚类中心就是用于减少 u k u_k uk引起的误差。
2.3 随机初始化
聚类中心的初始化:
- 聚类中心数量应该小于样本量,即K<m
- 随机选择K个样本作为聚类中心
为了能够避免算法得到局部最优解而不能最小化代价函数,需要尝试多次初始化并运行算法,最后选择代价函数最小的结果。但是一般来说,k=2-10时这种方法奏效,若k过大则多次初始化可能无效。
在选择聚类中心数量时,需要选择服务于该目的的聚类数,或者选择不同的聚类数并取最好的结果。