K-Means
聚类算法。
基础含义
K-Means是一种聚类算法,它可以把n个对象根据相互之间的相似度,自动划分到K个聚类。 但并不是任意的划分,我们有明确的目标。通俗的讲,目标就是划分后的聚类, 每个类内部相对集中;而聚类与聚类之间则相对离散。
数学原理
给定n个观察点
其中每个观察点 Xi 都是d维向量,也就是说,只要把我们的任何一条数据预处理到d维空间,使得每个 |Xi|=d , 举个例子就是
其中 fik 就是第k个特征. 那么都可以采用此聚类方法处理数据。
那么我们的目标函数是什么呢?
我们需要划归到
S={S1,S2,...,Sk}
,其中
Si
是第i个聚类。
目标函数:
其中
μi代表Si的质心
(the mean of points in
Si
),这就是K-Means的Means
的意思。
|Si|
代表聚类的规模;
VarSi
则是
Si
的方差。
如何求一个集合的方差Var:
Var(X)=1n∑i=1n(xi−μ)2
其中μ=1n∑i=1nxiμ 其实就是平均值.
回过头来总结一下目标函数:
如果分好了K个聚类必须满足,每个聚类的方差相加,这个方差之和最小。简言之,就是开始所谓的每个聚类尽量离散程度较好(抱团),这样方差小。
k-Means的算法流程
- 随机选取k个聚类质心点为 μ1,μ2,...,μk∈Rn
- 重复下面的过程直到收敛
对于每一个样例,计算其应该属于哪个类:
Si:=argminj||Xi−μj||
对于每一个聚类j,重新计算质心:
通俗一点讲:
1、给出k个初始聚类中心,简称初始化质心。
2、repeat:
把每一个数据对象重新分配到k个聚类中心处,形成k个簇
重新计算每一个簇的聚类中心
3、until 聚类中心不在发生变化
最小值和求导
既然目标函数已经确定了,求最小值也明确了。如何求极值(极小)呢。
最经典的数学方法,求导。参考
质心为啥是平均值
延续上面的求导。
对 μi 求导:
为了求极值,导数是0是必要条件。
推出:
其中 xi1∈Si,总的长度为m ,于是:
最后大功告成:
质心是当前聚类的平均值就此证明结束。
一定收敛吗
涉及非凸函数,参考https://www.zhihu.com/question/20343349。待研究。
实现收敛方法的EM有啥关系
k-means算法与EM算法的关系是这样的:
** k-means是两个步骤交替进行,可以分别看成E步和M步;
** M步中将每类的中心更新为分给该类各点的均值,可以认为是在「各类分布均为单位方差的高斯分布」的假设下,最大化似然值;
** E步中将每个点分给中心距它最近的类(硬分配),可以看成是EM算法中M步(软分配)的近似。
缺点
- 对异常值敏感
- 需要提前确定k值
如何确定k:
- 数据的先验知识,或者数据进行简单分析能得到基于变化的算法:即定义一个函数,随着K的改变,认为在正确的K时会产生极值
- 基于结构的算法:即比较类内距离、类间距离以确定K。这个也是最常用的办法,如使用平均轮廓系数,越趋近1聚类效果越好;如计算类内距离/类间距离,值越小越好;等。
- 基于一致性矩阵的算法:即认为在正确的K时,不同次聚类的结果会更加相似,以此确定K
- 基于层次聚类:即基于合并或分裂的思想,在一定情况下停止从而获得K。
- 基于采样的算法:即对样本采样,分别做聚类;根据这些结果的相似性确定K。如,将样本分为训练与测试样本;对训练样本训练分类器,用于预测测试样本类别,并与聚类的类别比较。
代码
https://github.com/serban/kmeans
可以有哪些应用
文本聚类,通过设置一定的K,文档聚类,从而发现热点新闻。
引用
https://en.wikipedia.org/wiki/K-means_clustering
https://en.wikipedia.org/wiki/Variance