聚类算法总结

来源:互联网 发布:淘宝技术这十年 编辑:程序博客网 时间:2024/06/06 16:39
聚类是指一种学习方法,即把物理或者抽象对象的集合分组为由彼此类似的对象组成的多个类簇的分析过程。

聚类算法介绍

K-Means算法

K-Means算法是最常用的聚类算法之一,具体步骤如下:

  1. 从n个向量对象任意选择K个向量作为初始聚类中心;
  2. 根据1中设置的K个中心向量,计算每个对象与这k个中心向量的距离;
  3. 对于2中的计算,每个向量与这k个向量都有一个距离。把这个向量和距离它最近的中心向量归为一个类簇中;
  4. 重新计算每个类簇的中心向量位置;
  5. 重复3、4,直到类簇的向量归类变化极少为止。例如一次迭代后只有少于1%的向量发生归类漂移,则认为聚类结束。

注意
- 需要事先指定类簇的数量
- 需要事先给定初始的类簇中心

K-Means算法中的距离计算可以选择,简单的话可以选择欧氏距离和曼哈顿距离,还可以选择余弦相似度进行度量。

层次聚类

K-Means算法是直接把样本分成若干类簇,而层次聚类是通过聚类把样本根据距离分成若干类簇,类簇之间相异,类簇内部相似,每个类簇内部又继续划分若干小类簇,最后形成一棵树的结构。
层次聚类有两种思路,一种是凝聚的层次聚类方法,一种是分裂的层次聚类方法。凝聚的层次聚类是指在大量的样本中自底向上找那些距离比较近的样本先聚合成小的类簇,聚合到一定程度再由小的类簇聚合成大的类簇。分裂的层次聚类是先把所有样本分成若干大的类簇,然后每个大类簇中再划分。
分裂的层次聚类比较简单,可以利用K-Means先进行一次聚类,然后每个类簇中再利用K-Means聚类。
凝聚的层次聚类中有一点比较关键,就是小类簇聚合为大类簇的原则,一般是基于连接度的度量来判断是否应该合并,度量有三种不同的策略:

  1. Ward策略:根据类簇中的方差进行判断,使类簇内部方差最小化。
  2. Maximum策略:根据类簇之间的距离判断,使类簇之间的距离最大化。
  3. Average linkage策略:根据类簇之间的距离判断,使类簇之间的距离的平均值最小。

    层次聚类的思路对于实际问题的解决很有价值。

密度聚类

密度聚类用于聚类形状不规则的情况。sklearn提供专门用来做基于密度分类的算法库—sklearn.cluster.DBSCAN.
用法DBSCAN(eps, min_sample).fix(X)
X是样本向量;
eps是阈值,根据密度向外扩展的过程中如果发现这个阈值距离范围内中找不到向量,那么就认为这个聚簇已经聚类结束。
min_sample表示聚簇最小应该拥有多少个向量。如果类簇中的向量少于这个数则认为该聚类为噪声点,在结果中直接被舍弃。
参数需要在实验过程中进行多次调试。

聚类评估

聚类的质量评估包括以下三个方面:
1. 估计聚类的趋势。对于给定的数据集,评估该数据集是否存在非随机结构,也就是分布不均匀的情况。
2. 确定数据集中的簇数。多数算法需要在一开始就确定类簇的数量,并作为参数传递给算法。
3. 测量聚类的质量。可以用量化的方法来测量聚类的质量。

聚类趋势

常用霍普金斯统计量来进行聚类趋势的量化评估。
1. 从所有样本中随机找n个向量,把它们称为p向量,分别为p1,p2,…,pn。对每个向量都在样本空间中找一个离其最近的向量,然后求距离,然后用x1,x2,…xn 来表示。
2. 在所有样本向量中随机找n个向量,称为q向量,分别为q1,q2,…qn 。对每个向量都在样本空间中找一个离其最近的向量,然后求距离,然后用y1,y2,…yn 来表示。
3. 求霍普金斯统计量H

H=sumni=1yisumni=1xi+sumni=1yi

上式中,如果聚类趋势不明显则H 接近于0.5,如果聚类趋势明显则H 接近1。

聚类簇数确定

常用的科学的方法称为“肘方法”,具体介绍见WiKi Determining the number of clusters in a data set
此方法时间复杂度很高,在线计算时不推荐,需要在适当的地在计算效率和收益程度上做一个平衡。

测定聚类质量

测定聚类质量方法一般分为外在方法和内在方法。外在方法是一种依靠类别基准的方法,即在已经有比较严格的类别定义时再讨论聚类是否准确。所以一般使用内在方法。
内在方法不会参考类簇的标准,而是使用轮廓系数进行度量。对于n个向量的样本空间,假设它被划分为k个类簇,即C1C2C3,…,Ck。对于任何一个样本空间中的向量v 来说,可以求v 到本类簇中其他各点的距离的平均值a(v),还可以求v 到所有其他类簇的最小平均距离(即从每个类簇中选一个离v 最近的向量,然后计算距离),求这些距离的平均值,得到b(v),则轮廓系数定义为:

s(v)=b(v)a(v)max[a(v),b(v)]

这个函数结果在-1和1之间,a(v)表示类簇内部的紧凑型,越小越紧凑,b(v)表示该类簇和其他类簇之间的分离程度。如果s(v)接近1,即a(v)比较小,而b(v)比较大时,说明包含v 的类簇很紧凑,而且远离其他类簇。如果s(v)为负数,则说明a(v)>b(v),这种情况则说明聚类质量很低。

参考

高扬. 白话大数据与机器学习[M]. 机械工业出版社, 2016.