聚类算法

1. 引言

聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大,类别内数据相似度较小。是一种无监督的学习算法。

2. K 均值算法详解(K-means)

2.1算法流程

K 均值算法,应该是聚类算法中最为基础但也最为重要的算法。其算法流程如下:

  1. 随机的取 k 个点作为 k 个初始质心;
  2. 计算其他点到这个 k 个质心的距离;
  3. 如果某个点 p 离第 n 个质心的距离更近,则该点属于 cluster n,并对其打标签,标注 point p.label=n,其中 n<=k;
  4. 计算同一 cluster 中,也就是相同 label 的点向量的平均值,作为新的质心;
  5. 迭代至所有质心都不变化为止,即算法结束。

当然算法实现的方法有很多,比如在选择初始质心时,可以随机选择 k 个,也可以随机选择 k 个离得最远的点等等,方法不尽相同。

2.2 k值估计

对于 k 值,必须提前知道,这也是 kmeans 算法的一个缺点。当然对于 k 值,我们可以有很多种方法进行估计。本文中,我们采用平均直径法来进行 k 的估计。

也就是说,首先视所有的点为一个大的整体 cluster,计算所有点之间距离的平均值作为该 cluster 的平均直径。选择初始质心的时候,先选择最远的两个点,接下来从这最两个点开始,与这最两个点距离都很远的点(远的程度为,该点到之前选择的最远的两个点的距离都大于整体 cluster 的平均直径)可视为新发现的质心,否则不视之为质心。设想一下,如果利用平均半径或平均直径这一个指标,若我们猜想的 K 值大于或等于真实的 K 值,也就是簇的真实数目,那么该指标的上升趋势会很缓慢,但是如果我们给出的 K 值小于真实的簇的数目时,这个指标一定会急剧上升。

根据这样的估算思想,我们就能估计出正确的 k 值,并且得到 k 个初始质心,接着,我们便根据上述算法流程继续进行迭代,直到所有质心都不变化,从而成功实现算法。如下图所示:
在这里插入图片描述
我们知道 k 均值总是收敛的,也就是说,k 均值算法一定会达到一种稳定状态,在此状态下,所有的点都不会从一个簇转移到另一个簇,因此质心不在发生改变。在此,我们引出一个剪枝优化,即:k 均值最明显的收敛过程会发生在算法运行的前期阶段,故在某些情况下为了增加算法的执行效率,我们可以替换上述算法的第五步,采用“迭代至仅有 1%~3%的点在影响质心”或“迭代至仅有 1%~3%的点在改变簇”。

k 均值适用于绝大多数的数据类型,并且简单有效。但其缺点就是需要知道准确的 k 值,并且不能处理异形簇,比如球形簇,不同尺寸及密度的簇,环形簇等等。

本文主要为算法讲解及实现,因此代码实现暂不考虑面向对象思想,采用面向过程的实现方式,如果数据多维,可能会需要做数据预处理,比如归一化,并且修改代码相关方法即可。

3. 层次聚类算法详解

3.1算法简介

层次聚类分为凝聚式层次聚类和分裂式层次聚类。

凝聚式层次聚类,就是在初始阶段将每一个点都视为一个簇,之后每一次合并两个最接近的簇,当然对于接近程度的定义则需要指定簇的邻近准则。

分裂式层次聚类,就是在初始阶段将所有的点视为一个簇,之后每次分裂出一个簇,直到最后剩下单个点的簇为止。

本文中我们将详细介绍凝聚式层次聚类算法。

对于凝聚式层次聚类,指定簇的邻近准则是非常重要的一个环节,在此我们介绍三种最常用的准则,分别是 MAX, MIN, 组平均。如下图所示:
在这里插入图片描述
图 2. 层次聚类计算准则

3.2 算法流程

凝聚式层次聚类算法也是一个迭代的过程,算法流程如下:

  1. 每次选最近的两个簇合并,我们将这两个合并后的簇称之为合并簇。
  2. 若采用 MAX 准则,选择其他簇与合并簇中离得最远的两个点之间的距离作为簇之间的邻近度。若采用 MIN 准则,取其他簇与合并簇中离得最近的两个点之间的距离作为簇之间的邻近度。若组平均准则,取其他簇与合并簇所有点之间距离的平均值作为簇之间的邻近度。
  3. 重复步骤 1 和步骤 2,合并至只剩下一个簇。

4. DBSCAN 算法详解

考虑一种情况,点的分布不均匀,形状不规则时,Kmeans 算法及层次聚类算法将面临失效的风险。
如下坐标系:
图 5. DBSCAN 算法举例
在这里插入图片描述

我们可以看到上面的点密度不均匀,这时我们考虑采用基于密度的聚类算法:DBSCAN。

3.1 算法流程

  1. 设定扫描半径 Eps, 并规定扫描半径内的密度值。若当前点的半径范围内密度大于等于设定密度值,则设置当前点为核心点;若某点刚好在某核心点的半径边缘上,则设定此点为边界点;若某点既不是核心点又不是边界点,则此点为噪声点。
  2. 删除噪声点。
  3. 将距离在扫描半径内的所有核心点赋予边进行连通。
  4. 每组连通的核心点标记为一个簇。
  5. 将所有边界点指定到与之对应的核心点的簇总。

3.2 算法过程举例

如上图坐标系所示,我们设定扫描半径 Eps 为 1.5,密度阈值 threshold 为 3,则通过上述算法过程,我们可以得到下图:

图 6. DBSCAN 算法举例结果示例

在这里插入图片描述
通过计算各个点之间的欧式距离及其所在扫描半径内的密度值来判断这些点属于核心点,边界点或是噪声点。因为我们设定了扫描半径为 1.5,密度阈值为 3,所以:

  • P0 点为边界点,因为在以其为中心的扫描半径内只有两个点 P0 和 P1;
  • P1 点为核心点,因为在以其为中心的扫描半径内有四个点 P0,P1,P2,P4 ;
  • P8 为噪声点,因为其既非核心点,也非边界点;
  • 其他点依次类推。

4. BIRCH 算法

Birch 是一种能够高效处理大数据聚类的基于树的层次聚类算法。设想这样一种情况,一个拥有大规模数据的数据库,当这些数据被放入主存进行聚类处理时,一般的聚类算法则没有对应的高效处理能力,这时 Birch 算法是最佳的选择。

Birth 不仅能够高效地处理大数据聚类,并且能最小化 IO 花销。它不需要扫描全局数据已经现有的簇。

4.1 算法流程

聚类特征 CF=(N,LS,SS),其中 N 代表簇中点的个数,LS 代表簇中代表簇中各点线性和,SS 代表簇中各点的平方和距离。聚类特征被应用于 CF 树中,CF 树是一种高度平衡树,它具有两个参数:平衡因子 B 和簇半径阈值 T。其中平衡因子 B 代表每一个非叶子节点最多能够引入 B 个实体条目。

叶子节点最多只能包含 L 个实体条目,并且它们具有前向后向指针,这样可以彼此链接起来。

树的大小取决于簇半径阈值 T 的大小。

  1. 从根节点开始,递归查找与要插入的数据点距离最近的叶子节点中的实体条目,递归过程选择最短路径。
  2. 比较上述计算出的数据点与叶子节点中实体条目间的最近距离是否小叶簇半径阈值 T,小于则吸收该数据点。否则执行下一步。
  3. 判断当前条目所在的叶节点个数是否小于 L,若小于则直接将该数据点插入当前点。否则分裂叶子节点,分裂过程是将叶子节点中距离最远的两个实体条目变为新的两个叶子节点,其他条目则根据距离最近原则重新分配到这两个新的叶子节点中。删除原来的叶子节点并更新 CF 树。

若不能将所有数据点加入 CF 树中,则考虑增加簇半径阈值 T,并重新更新 CF 树直至所有的数据点被加入 CF 树为止。

5. CURE 算法

算法流程

  1. 在数据集中选择样本数据。
  2. 将上述样本数据划分为 P 个同样大小的划分。
  3. 将每个划分中的点聚成 m/pq 个簇,共得到 m/q 个簇。过程中需删除噪声点。
  4. 对上述 m/q 个簇进行聚类直至剩下 k 个簇。
  5. 继续删除离群点。
  6. 将剩下的点指派到最近的簇完成聚类过程。

谱聚类

当然经典的还有谱聚类算法可以自行查阅☺

参考 : IBM developerWorks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值