一、经典聚类算法
1. 问题描述
输入:给定训练样本,
x
i
∈
R
n
x_{i}\in R^{n}
xi∈Rn,但是没有给标签(聚类算法是属于无监督学习)
输出:将样本聚类成k个簇(cluster)
2. 算法思路
随机先选定初始聚类中心,然后计算每一个样本到 聚类中心的最短距离,并按照距离最小划分对应类,重新计算聚类质心,循环直到收敛
算法步骤:
- 1.从数据集中随机选择K个样本作为初始化聚类中心 C = ( c 1 , c 2 , . . . . , c k ) C=(c_{1},c_{2},....,c_{k}) C=(c1,c2,....,ck)
- 2.对于数据中的每一个样本 x i x_{i} xi,计算到K个聚类中心的距离,并将这个样本分类到距离最小的聚类中心所对应的类中
- 3.对于分完的每一个类别 c i c_{i} ci,重新计算聚类中心 c i = 1 ∣ c i ∣ ∑ c ∈ c i x c_{i}=\frac{1}{|c_{i}|}\sum_{c\in c_{i}}x ci=∣ci∣1c∈ci∑x(就是属于该类的所有样本点的质心)
- 4.重复直到收敛
3. 问题讨论:
1> 若把所有点都分类完成,那么这个类的聚类中心是什么:
聚类中心是该类中所有样本的均值
2> 为什么K-means算法会一直收敛,收敛的最小值是全局最优值吗?
实际上K-means聚类的目标函数是:
J = ∑ i = 1 n m i n j ∈ ( 1 , 2... , k ) ∣ ∣ x i − c j ∣ ∣ 2 J=\sum_{i=1}^{n}min_{j\in (1,2...,k)}||x^i-c_{j}||^2 J=i=1∑nminj∈(1,2...,k)∣∣xi−cj∣∣2
- 所以可以看到J是非凸函数,意味着不能保证取得的最小值是全局最小值,也就是说k-means对质心初始位置的选取比较敏感
- 可以发现每一轮计算固定每个类的质心,调整每个样例的所属的类别能让J函数减少,同样固定分类,调整每个类的质心也可以使J减小,所以每次计算目标函数的值都在减小
3>为什么随机选择初始值容易出错
可以分析下初始化选择的k个中心点正好被我们选在了K个簇群的概率:
k个中心点有 k ! 种选择,但是每一个簇群有k种选择,一共有k个簇群,那么概率就是 k ! K k ≃ 1 e k \frac{k!}{K^k} \simeq \frac{1}{e^k} Kkk!≃ek1,那么当有多个分类的时候会发现我们的错误率几乎为0
4>优化的重点在哪里,优化的思路是怎样的
- means对质心初始位置的选取比较敏感,所以初始化类的确定是优化的重点
- 增加初始化选择的k个中心点正好被我们选在了K个簇群的概率
二、K-means++算法
1. 初始类质心的优化思路
- 最远遍历
思路:随机选取聚类点k1,k2的选择离k1最远的点,k3选择离k1和k2最远的点,依次次类推,选择得到所有初始化质心,这样尽量可以保证每一个簇群能有一个中心点被选中
缺点:
这样的选择方案受到噪声点(outliner)的影响比较大
如图:
第一个点选择红色,按照最远遍历选择方案,第二个点选择绿色点,第三个点选择中间黑色团
聚类效果如下:(显然不是最优结果)
- K-means++
如下介绍
2. K-means++算法
参考论文[3]
- 1.从数据集中随机选择一个样本点作为初始聚类中心 c i c_{i} ci
- 2.计算每个样本与已有最近聚类中心距离 D ( x ) D(x) D(x):然后计算每个样本被选中为下一个聚类中心的概率公式为 D ( x ) 2 ∑ x ∈ X D ( x ) 2 \frac{D(x)^2}{\sum_{x\in X }D(x)^2} ∑x∈XD(x)2D(x)2,然后按照轮盘法选择出下一个聚类中心
- 3.一直选完K个聚类中心
- 4.按照经典K-means算法直到收敛
什么是轮盘法:
将每个样本的概率P(x)累加排序,利用随机数产生器,随机产生出一个0~1之间的随机数,判断它属于哪个概率区间之间,那么该区间对应的序号就是被选择出来的第二个聚类中心,详细看参考论文3
3.讨论分析
- 1.时间复杂度分析
初始化时,需要算每个样本到聚类中心的值所以每一个点 O ( n d ) O(nd) O(nd),n为样本数,d为样本维度,那么有K个聚类中心就是 O ( K n d ) O(Knd) O(Knd),是一个线性复杂度
每一回合迭代也是 O ( K n d ) O(Knd) O(Knd),所以初始化的复杂度可以忽略
- 2.K值如何选取
交叉验证,分成训练级和测试集,得到K
Elbow method:是说明采取多个K值比如(0到100),画出损失函数值曲线变化图,选择那个已经没有明显变化的K值就是最佳值,如图:选择K=3.
四、 参考
- 《机器学习》. 周志华
- 《统计学习方法》. 李航
- 2007年由D. Arthur等人提出的K-means++论文