K-Means简记

来源:互联网 发布:竞技类网游知乎 编辑:程序博客网 时间:2024/06/13 19:48

K-Means聚类算法。

基础含义

K-Means是一种聚类算法,它可以把n个对象根据相互之间的相似度,自动划分到K个聚类。 但并不是任意的划分,我们有明确的目标。通俗的讲,目标就是划分后的聚类, 每个类内部相对集中;而聚类与聚类之间则相对离散。

数学原理

给定n个观察点

X1,X2,...,Xn

其中每个观察点Xi都是d维向量,也就是说,只要把我们的任何一条数据预处理到d维空间,使得每个|Xi|=d, 举个例子就是
Xi=[fi1,fi2,...,fid],

其中fik就是第k个特征. 那么都可以采用此聚类方法处理数据。

那么我们的目标函数是什么呢?
我们需要划归到S={S1,S2,...,Sk},其中Si是第i个聚类。

目标函数:

argmini=1k(XSi||Xμi||2)=argmini=1k(|Si|VarSi)

其中μiSi(the mean of points in Si),这就是K-Means的Means的意思。
|Si|代表聚类的规模;
VarSi则是Si的方差。

如何求一个集合的方差Var:

Var(X)=1ni=1n(xiμ)2

其中
μ=1ni=1nxi
μ其实就是平均值.

回过头来总结一下目标函数:
如果分好了K个聚类必须满足,每个聚类的方差相加,这个方差之和最小。简言之,就是开始所谓的每个聚类尽量离散程度较好(抱团),这样方差小。

k-Means的算法流程

  1. 随机选取k个聚类质心点为μ1,μ2,...,μkRn
  2. 重复下面的过程直到收敛
    对于每一个样例,计算其应该属于哪个类:
    Si:=argminj||Xiμj||

对于每一个聚类j,重新计算质心:

μj:=XSiXm
m是聚类j的个数。

通俗一点讲:

1、给出k个初始聚类中心,简称初始化质心。
2、repeat:
把每一个数据对象重新分配到k个聚类中心处,形成k个簇
重新计算每一个簇的聚类中心
3、until 聚类中心不在发生变化

最小值和求导

既然目标函数已经确定了,求最小值也明确了。如何求极值(极小)呢。
最经典的数学方法,求导。参考
这里写图片描述

质心为啥是平均值

延续上面的求导。

argmini=1k(XSi||Xμi||2)

μi求导:
ki=1(XSi||Xμi||2)μi

=ii=i(XSi||Xμi||2)μi

=(XSi||Xμi||2)μi

=(XSi||Xμi||2)μi

=(XSi2||Xμi||)

为了求极值,导数是0是必要条件。
(XSi2||Xμi||)==0

(XSi||Xμi||)==0

推出:
(xi1μi)+(xi1μi)+...+(ximμi)==0

其中 xi1Si,m,于是:
mμi=XSiX

最后大功告成:
μi=XSiXm

质心是当前聚类的平均值就此证明结束。

一定收敛吗

涉及非凸函数,参考https://www.zhihu.com/question/20343349。待研究。

实现收敛方法的EM有啥关系

k-means算法与EM算法的关系是这样的:
** k-means是两个步骤交替进行,可以分别看成E步和M步;
** M步中将每类的中心更新为分给该类各点的均值,可以认为是在「各类分布均为单位方差的高斯分布」的假设下,最大化似然值;
** E步中将每个点分给中心距它最近的类(硬分配),可以看成是EM算法中M步(软分配)的近似。

缺点


  1. 对异常值敏感
  2. 需要提前确定k值
    如何确定k:

  1. 数据的先验知识,或者数据进行简单分析能得到基于变化的算法:即定义一个函数,随着K的改变,认为在正确的K时会产生极值
  2. 基于结构的算法:即比较类内距离、类间距离以确定K。这个也是最常用的办法,如使用平均轮廓系数,越趋近1聚类效果越好;如计算类内距离/类间距离,值越小越好;等。
  3. 基于一致性矩阵的算法:即认为在正确的K时,不同次聚类的结果会更加相似,以此确定K
  4. 基于层次聚类:即基于合并或分裂的思想,在一定情况下停止从而获得K。
  5. 基于采样的算法:即对样本采样,分别做聚类;根据这些结果的相似性确定K。如,将样本分为训练与测试样本;对训练样本训练分类器,用于预测测试样本类别,并与聚类的类别比较。

代码

https://github.com/serban/kmeans

可以有哪些应用

文本聚类,通过设置一定的K,文档聚类,从而发现热点新闻。

引用

https://en.wikipedia.org/wiki/K-means_clustering
https://en.wikipedia.org/wiki/Variance