层次聚类算法_从事数据科学需要掌握的5种聚类算法

聚类是一种涉及数据点分组的机器学习技术。给定一组数据点,我们可以使用聚类算法将每个数据点分类到特定的组。理论上,同一组中的数据点应具有相似的属性和/或特征,而不同组中的数据点应具有高度不同的属性和/或特征。聚类是一种无监督学习的方法,是许多领域中使用的常见统计数据分析技术。

在数据科学中,我们可以使用聚类分析,通过查看应用聚类算法时数据点归类到哪些组,从数据中获得一些有价值的见解。本文我们盘点从事数据科学需要掌握的5种聚类算法及其优缺点。

K 均值聚类

K 均值可能是最知名的聚类算法,很多入门数据科学和机器学习课程都会讲到它。这种聚类算法很容易理解,也很容易用代码实现!下图为 K 均值算法的实现过程图解:

a7dc5f2c02bdbc6ad1ce15a7d3a259e1.png
  • 首先,我们选择要用到的多个类/组,然后随机初始化它们的中心点。如果想知道所用的类的数量,最好快速查看数据并尝试识别所有不同的分组。中心点是与每个数据点向量长度相同的向量,也就是上面动图中的“X”标记。通过计算该点与每个组中心之间的距离,然后将该点分类为中心点最接近它的组,对每个数据点进行分类。基于这些分类后的点,我们通过取组中所有向量的均值来重新计算组中心。重复这些步骤,完成一定数量的迭代,或直到组中心在迭代后没有太大变化。也可以选择随机初始化组中心几次,然后选择看起来效果最佳的运行。

K 均值聚类的优势在于它非常快,因为我们所做的只是计算点和组中心之间的距离,计算量很少。因此它具有线性复杂度O(n)。

另一方面,K 均值也有几个缺点。首先,你必须选择有多少组/类。这一步可不是无关紧要,理想情况下,我们希望聚类算法能够为我们找出有多少组/类,因为它的价值是从数据中获得一些见解。 K 均值也从随机选择的聚类中心开始,因此它可能在算法的不同运行中产生不同的聚类结果。所以结果可能不具有可重复性且缺乏一致性。而其它聚类算法的结果更为一致。

K-Medians 是另一种与 K 均值相关的聚类算法,除了使用均值重新计算组中心点,我们还使用该组的中值向量。这种方法对异常值不太敏感(因为使用中位数),但对于较大的数据集要慢得多,因为在计算中值向量时每次迭代都需要排序。

Mean-Shift 聚类

Mean-shift 聚类是一种基于滑动窗口的算法,也叫均值漂移算法。它会找到数据点的密集区域。它是一种基于质心的算法,意味着其目标是定位每个组/类的中心点,工作方式是将中心点的候选位置更新为滑动窗口内的点的平均值。然后在后期处理阶段过滤这些候选窗口以消除近似重复,形成最后一组中心点及其对应的组。参看下面的图解:

0109177781edf1c4b95d70b3fc8f1ecb.png
  • 我们这里使用二维空间中的一组点来解释 Mean-shift 聚类,如上图所示。我们从以 C 点(随机选择)为中心并以半径 r 为核心的圆形滑动窗口开始。Mean-shift 是一种爬山算法,其涉及在每一步中以迭代的方式将该核心移动到更高密度区域,直至收敛。在每次迭代中,通过将中心点移动到窗口内的点的平均值(因此得名),将滑动窗口移向更高密度的区域。滑动窗口内的密度与其内部的数据点数量成比例。当然,通过移动到窗口中的点的平均值,它会渐渐移向更高点密度的区域。我们继续根据平均值移动滑动窗口,直到没有方向可以移动核心内中的更多数据点。看看上面的动图,我们继续移动圆圈,直到我们不再增加密度(即窗口中的点数)。步骤 1 至 3 的过程使用许多滑动窗口完成,直到所有点都位于窗口内。当多个滑动窗口重叠时,保留包含最多点的窗口。然后根据数据点所在的滑动窗口对数据点进行聚类。

下面的动图显示了所有滑动窗口从端到端的整个过程。每个黑点表示滑动窗口的质心,每个灰点是数据点。

c1d6d284577e17bf854b0a8f38667673.png

与 K 均值聚类相比,我们不需要选择聚类数量,因为 Mean-shift 能自动找到。这是一个巨大的优势。群集中心向最大密度点趋近也比较理想,因为这样非常直观易懂。其缺点就是窗口大小/半径“r”的选择非常重要,稍有不慎会极大地影响结果。

DBSCAN聚类

DBSCAN 是一种基于密度的聚类算法,类似于 Mean-shift 漂移,但具有几个显著的优点。参看下方这个动图:

e8faf539973f9f0dd3ca94b791fc2b06.png
  • DBSCAN 以未访问的任意起始数据点开始,使用距离ε提取该点的邻域(在 ε 距离内的所有点都是邻域点)。如果该邻域内有足够数量的点(根据 minPoints 大小),则聚类过程开始,当前数据点会成为新群集中的第一个点。否则,该点将被标记为噪声(稍后此噪声点可能成为群集的一部分)。在这两种情况下,该点都标记为“已访问”。对于新集群中的第一个数据点,其 ε 距离邻域内的点也会成为同一集群的一部分。然后,对于刚刚添加到群集组的所有新点,重复应用使 ε 邻域中的所有点属于同一群集的操作过程。重复步骤 2 和 3 的这个过程,直到确定了集群中的所有点,即已经访问并标记了簇的 ε 邻域内的所有点。完成当前群集后,检索并处理新的未访问点,从而发现另一个群集或噪声。重复该过程,直到所有点都标记为已访问。因为此时结束已访问了所有数据点,因此每个点都被标记过了,要么属于群集,要么属于噪声。

与其他聚类算法相比,DBSCAN 具有一些很大的优势。首先,它根本不需要预先设置好数量的群集。它还将异常值识别噪声,这和 Mean-shift 不一样,后者即使数据点相差很大,也只是将它们归入群集。另外,它能够很好地找到任意大小和任意形状的群集。

DBSCAN 的主要缺点是当群集具有不同的密度时,它的性能不如其它的聚类算法。这是因为当密度变化时,用于识别邻域点的距离阈值 ε 和 minPoints 的设置会在群集与群集之间发生变化。非常高维的数据也会出现这种缺点,因为距离阈值 ε 同样非常难以估计。

使用高斯混合模型(GMM)的最大期望(EM)聚类

K 均值的一个主要缺点是它只简单使用了群集中心的平均值。可以参考下图了解为什么这不是最好的方法。能很明显地在左图看到,有两个不同半径的圆形群集具有相同的平均值中心。 K 均值聚类无法处理这个问题,因为聚类的平均值非常接近。在群集不是圆形的情况下,K 均值也会失败,这也是使用均值作为群集中心的结果。

3550ad07e91d4903c57cecb2d767bd40.png

高斯混合模型(GMM)比 K 均值更具灵活性。对于 GMM,我们假设数据点呈高斯分布。这种假设相比说它们是使用均值来循环的,限制性要小。这样,我们有两个参数来描述群集的形状:平均值和标准偏差。以二维为例,这意味着聚类可以采用任何类型的椭圆形状(因为我们在 x 和 y 方向都有标准偏差)。因此,每个高斯分布被分配给单个簇。

为了找到每个聚类的高斯参数(例如平均值和标准偏差),我们使用称为最大期望(EM)的优化算法。下图展现了高斯分布应用到群集的过程。然后我们可以继续使用 GMM 进行最大期望的聚类过程。

f233b919305f4fda10449bfcbe30fe2c.png
  • 我们首先选择群集的数量(类似 K 均值中的做法),并随机初始化每个群集的高斯分布参数。通过快速查看数据,可以以比较高的准确度猜测初始参数。不过注意,不是百分之百必须这样,如上图所示,刚开始时高斯分布非常不好,但很快就得到了优化。给定每个聚类的这些高斯分布,计算每个数据点属于特定聚类的概率。数据点越接近高斯中心,它就越有可能属于该群集。这应该很直观,因为对于高斯分布,我们假设大多数数据更靠近群集的中心。基于这些概率,我们为高斯分布计算一组新参数,以便最大化群集内数据点的概率。我们使用数据点位置的加权和来计算这些新参数,其中权重是数据点属于该特定群集的概率。以上图为例,解释一下,特别是黄色群集。在第一次迭代时,分布随机开始,但我们可以看到大多数黄点位于该分布的右侧。当我们计算由概率加权的总和时,即使有些点离中心很近,它们中的大多数都在右边。因此,分布的均值自然转为更接近那些点。我们还可以看到大多数点都是“从右上角到左下角”分布。因此,标准偏差发生改变以创建更适合这些点的椭圆,以便最大化由概率加权的总和。迭代地重复步骤 2 和 3 直到收敛,其中各个迭代之间的分布状况变化不大。

使用 GMM 确实有两个大优势。首先,GMM 在群集协方差方面比 K 均值灵活的多。由于标准偏差参数,群集可以采用任何椭圆形状,而不是局限于圆形。K 均值实际上是 GMM 的一个特例,其中每个群集的所有维度的协方差都接近 0。其次,由于 GMM 使用概率,所以每个数据点可以有多个聚类。因此,如果数据点位于两个重叠的集群的中间,我们可以简单地定义它的类,通过说它百分之 X 属于类 1 和百分之 Y 属于类 2。也就是说 GMM 支持混合方式。

合成层次聚类

层次聚类算法实际上分为两类:自上而下或自下而上。自下而上算法在开始时将每个数据点视为单个群集,然后连续地合并(或聚集)成对的群集,直到所有群集已合并到包含所有数据点的单个群集中。因此,自下而上的层次聚类称为合成层次聚类,也叫 AHC。这种群集的层次结构表示为树(或树状图)。树的根是收集所有样本的唯一群集,叶子则是只有一个样本的群集。参看下图。

067d4515148bfdf70fc2bdecd33554a1.png
  • 我们首先将每个数据点视为一个单独的群集,即如果我们的数据集中有 X 个数据点,那么我们就有 X 个群集。然后,我们选择衡量两个群集之间距离的距离度量。我们将使用平均连锁法(average linkage)作为例子,它将两个群集之间的距离定义为第一个群集中的数据点与第二个群集中的数据点之间的平均距离。在每次迭代中,我们将两个群集合并为一个。将要组合的两个群集选择为具有最小平均连锁的群集。即,根据我们选择的距离度量,这两个群集彼此之间的距离最小,因此最相似,应该组合在一起。重复步骤 2,直到我们到达树的根部,即我们只有一个包含所有数据点的群集。通过这种方式,我们可以选择最终需要多少个群集,只需选择何时停止组合群集,也就是当我们停止构建树的时候。

层次聚类不需要我们指定群集的数量,我们甚至可以选择多少数量的群集为最佳,因为我们是在构建树。另外,该算法对距离度量的选择不敏感。层次聚类方法的一个特别好的用例是当底层数据具有层次结构并且你想要恢复层次结构时,其他聚类算法做不到。层次聚类的这些优点是以低效率为代价的,因为它具有 O(n³)的时间复杂度,与 K 均值和 GMM 的线性复杂性不同。

结语

本文总结了从事数据科学需要熟悉的 5 种聚类算法,即 K 均值聚类、Mean-shift 聚类、DBSCAN 聚类、EM 聚类与合成层次聚类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
K-Means 聚类算法是一基于距离的聚类算法,它将数据集分成 K 个簇,每个簇的中心点就是该簇内所有点的质心。K-Means 聚类算法的步骤如下: 1. 随机选择 K 个点作为簇的中心点。 2. 计算每个样本点到 K 个中心点的距离,将其分配到最近的簇中。 3. 对于每个簇,重新计算该簇的中心点。 4. 重复步骤 2 和 3,直到簇不再发生变化或达到最大迭代次数。 下面是使用 K-Means 聚类算法对鸢尾花数据进行聚类的 Python 代码: ``` python import numpy as np from sklearn.cluster import KMeans from sklearn.datasets import load_iris import matplotlib.pyplot as plt # 加载鸢尾花数据集 iris = load_iris() X = iris.data # 定义 K 值和最大迭代次数 k = 3 max_iter = 300 # 使用 K-Means 聚类算法 kmeans = KMeans(n_clusters=k, max_iter=max_iter) kmeans.fit(X) # 获取聚类结果和簇的中心点 labels = kmeans.labels_ centers = kmeans.cluster_centers_ # 绘制聚类结果图 plt.scatter(X[:, 0], X[:, 1], c=labels) plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='*', s=200) plt.title('K-Means Clustering') plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.show() ``` 上述代码中,首先加载鸢尾花数据集,然后定义 K 值和最大迭代次数。接着使用 K-Means 聚类算法,获取聚类结果和簇的中心点。最后绘制聚类结果图,其中样本点的颜色表示它所属的簇,红色星号表示每个簇的中心点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值