聚类是指一种学习方法,即把物理或者抽象对象的集合分组为由彼此类似的对象组成的多个类簇的分析过程。
聚类算法介绍
K-Means算法
K-Means算法是最常用的聚类算法之一,具体步骤如下:
- 从n个向量对象任意选择K个向量作为初始聚类中心;
- 根据1中设置的K个中心向量,计算每个对象与这k个中心向量的距离;
- 对于2中的计算,每个向量与这k个向量都有一个距离。把这个向量和距离它最近的中心向量归为一个类簇中;
- 重新计算每个类簇的中心向量位置;
- 重复3、4,直到类簇的向量归类变化极少为止。例如一次迭代后只有少于1%的向量发生归类漂移,则认为聚类结束。
注意
- 需要事先指定类簇的数量
- 需要事先给定初始的类簇中心
K-Means算法中的距离计算可以选择,简单的话可以选择欧氏距离和曼哈顿距离,还可以选择余弦相似度进行度量。
层次聚类
K-Means算法是直接把样本分成若干类簇,而层次聚类是通过聚类把样本根据距离分成若干类簇,类簇之间相异,类簇内部相似,每个类簇内部又继续划分若干小类簇,最后形成一棵树的结构。
层次聚类有两种思路,一种是凝聚的层次聚类方法,一种是分裂的层次聚类方法。凝聚的层次聚类是指在大量的样本中自底向上找那些距离比较近的样本先聚合成小的类簇,聚合到一定程度再由小的类簇聚合成大的类簇。分裂的层次聚类是先把所有样本分成若干大的类簇,然后每个大类簇中再划分。
分裂的层次聚类比较简单,可以利用K-Means先进行一次聚类,然后每个类簇中再利用K-Means聚类。
凝聚的层次聚类中有一点比较关键,就是小类簇聚合为大类簇的原则,一般是基于连接度的度量来判断是否应该合并,度量有三种不同的策略:
- Ward策略:根据类簇中的方差进行判断,使类簇内部方差最小化。
- Maximum策略:根据类簇之间的距离判断,使类簇之间的距离最大化。
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: