【机器学习】-- 聚类

聚类

一:聚类分析概述

简单来说,聚类(Cluster Analysis)是将数据集划分为若干个相似对象组成的多个组(group)或簇(cluster)的过程。使得同一组对象之间的相似度最大化,不同组之间对象的相似度最小化。或者说一个簇就是由彼此相似的一组对象所构成的集合。不同簇中的对象不相似,或者相似度很低很低。

1.聚类分析的定义

聚类分析(Cluster Analysis)是一个将数据集中的所有数据,按照相似性划分为多个簇的过程。

簇 是相似数据的集合。

聚类分析是一种无监督的分类方法,数据集中的数据没有预定义的类别标号(没有训练集合训练过程)

要求:聚类分析之后尽可能的保证类别相同的数据之间的相似度较高。而类别不同的数据之间的的相似度较低。

 

聚类分析在数据挖掘中的作用:

-作为一个独立的工具来获得数据集中数据的分布情况,

  • 首先,对数据集执行聚类,获得所有的簇;
  • 然后,根据每个簇中样本的数目获取数据集中每个类数据的大体的分布情况。

-作为其他数据挖掘算法的预处理步骤。

  • 首先,对数据进行分类---粗分类
  • 然后,分别对每个簇进行特征提取和细分类。可以有效提高分类精度

3.常用的聚类分析方法;

3.1划分法:以距离作为数据集中不同数据将的相似性度量,将数据划分为多个簇。   划分准则:同一个簇中的样本尽可能的接近或相似;不同簇中的样本尽可能的原理或不相近。

3.2以样本间的 距离作为相似性度量:

典型的聚类方法:

K - means (K-均值算法)由簇中样本的平均值来代表整个簇,

K - medoids(K - 中心算法)由处于簇中心区域的某个样本代表整个簇等。

3.3层次法:对给定的数据进行一个层次分解,形成一个树的聚类结果。

自顶向下法(合并)开始时,将每个样本作为一个单独的组,然后依次合并相近的样本或组,直到所有的样本或组被合并,为一个组或者达到最终条件为止, 代表算法:AGNES算法(合并聚类法)

自底向上法:(分裂),开始时,将所有的样本置于一个簇中,然后进行迭代,在迭代的每一步中,一个簇被分裂为更多更小的簇,直到每一个样本分别在一个单独的簇中或者达到停止所要的条件。 代表算法:DIANA算法(分裂聚类法)

3.4密度法:

 • 基于密度的聚类: DBSCAN算法

相似性计算方法

  • 在聚类分析中,样本之间的相似性通常采用样本之间的距离来表示。

– 两个样本之间的距离越大,表示两个样本越不相似性,差异性越大;
– 两个样本之间的距离越小,表示两个样本越相似性,差异性越小。
– 特例:当两个样本之间的距离为零时,表示两个样本完全一样,无差异。

  • – 样本之间的距离是在样本的描述属性(特征)上进行计算的。

– 在不同应用领域,样本的描述属性的类型可能不同,因此相似性的计算方法也不尽相同。
• 连续型属性(如:重量、高度、年龄等)
• 二值离散型属性(如:性别、考试是否通过等)
• 多值离散型属性(如:收入分为高、中、低等)
• 混合类型属性(上述类型的属性至少同时存在两种)

 

连续型属性的相似性计算方法

• 假设两个样本Xi和Xj分别表示成如下形式:

他们都是d维的特征向量,并且每一维的特征都是一个连续型数值。

对于连续型属性,样本之间的相似性通常是采用如下的三种的距离公式计算。

 

二值离散型属性的相似性计算方法

  • 二值离散型属性只有0和1两个取值。

    – 其中:0表示该属性为空,1表示该属性存在。
    – 例如:描述病人的是否抽烟的属性(smoker),取值为1表示病人抽烟,取值0表示病人不抽烟。

  •  假设两个样本Xi和Xj分别表示成如下形式:

 

– 它们都是p维的特征向量,并且每维特征都是一个二值离散型数值

• 假设二值离散型属性的两个取值具有相同的权重,则可以得到一个两行两列的可能性矩阵

  • 相似度/距离加算方法总结: 

 

K-MEANS聚类算法

K-Means聚类算法可能是大家最熟悉的聚类算法。它出现在很多介绍性的数据科学和机器学习课程中。在代码中很容易理解和实现!请看下面的图表。

K-Means聚类

1:首先我们选择一些类或组来使用,并随机的初始化他们各自的中心点。想要知道使用类的数量,最好快速的先看一下自己的数据,并尝试识别任何不同的分组,中心点是与每个数据点向量长度相同的向量,在上面的图形中的是“X”。

2:每个数据点通过计算与每个组中心点的距离来进行分类,然后将这个点分为最接近的组

3:基于这些分类点,我们取它与组中所有点的均值来重新计算组中心。

4:对每一组迭代重复这些步骤,当然你可以随机初始化组中心点几次,然后选择那些看起来对他提供了最好的结果的来运行。

优点:K-Means聚类算法的优势在于它的速度非常快,因为我们所做的只是计算点和群中心之间的距离;它有一个线性复杂度O(n)。

缺点:首先,你必须要选择有多少组或类。这是非常重要也是必须要做的事情,理想情况下,我们都是希望通过他来帮我们解决某些问题的,因为他的关键在于从数据中获得一些启示,也就是能选取点与这个组中所有点的均值。但是在不同的算法中我们很可能会产生不同的聚类结果的,因此,结果可能是不可重复的,并且缺乏一致性。相比之下其他的聚类方法更加一致,复现行更强。

K-Medians是另一种与K-Means有关的聚类算法,除了使用均值的中间值来重新计算组中心点以外,这种方法对离群值的敏感度较低(因为使用中值),但对于较大的数据集来说,它要慢得多,因为在计算中值向量时,每次迭代都需要进行排序。

均值偏移聚类算法

均值偏移(Mean shift)聚类算法是一种基于滑动窗口(sliding-window)的算法,他试图找到密集的数据点,而且还是一种基于中心的算法,他的目标是定位每一类的中心点。通过更新候选点来实现,滑动窗口中的点的平均值,这些候选窗口在后期处理阶段被过滤,已消除几乎重复的部分,形成最后一组中心点以及其对应的组。请看下面的图标。

单滑动窗口的均值偏移聚类

1:为了解释这一现象,我们考虑二维空间中的一组点。(就像上面的例子)。我们以一个点C(随机选取)为中心的圆形滑动窗口开始,以半径 r 为内核,均值偏移就想一种爬山算法(hill climbing algorithm),他需要将每个步骤中的反复的将这个内核移动到一个更高的密度区域,知道收敛。

2:在每一次的迭代中,滑动窗口会移向密集更高的区域,将中心点移动到窗口内的点的平均值(因此得名)。滑动窗口中的密度与 它每部的点的数量成比例。自然的通过移向窗口中的点的平均值,他将逐渐向更高更密集的方向移动。

3:我们继续根据均值来移动滑动窗口,知道没有方向可以容纳内核中更多的点。看看上面的图表,我们一直在移动这个园,知道圆里面的密度不在增加。(也就是窗口中的点的数量。)

4:步骤1到3的过程,是许多滑动窗口完成的,知道所有的点都位于一个窗口内部,当多个滑动窗口重叠的时候,包含点最多的窗口就会被保留,然后数据点根据他们所在的滑动窗口聚类。

下面展示了从端到端所有滑动窗口的整个过程的演示,每个黑点代表一个滑动窗口的质心,每个灰色的点都是一个数据点。

上图展示了均值偏移聚类的整个过程

与K-Means聚类相比,均值偏移聚类不需要选择聚类的数量,因为他会自动的发现这一点。这是一个巨大的优势。聚类中心收敛于最大密度点的事实也是非常可取的,因为它非常直观地理解并适合于一种自然数据驱动,难点/缺点是选择窗口的大小(也就是圆的半径)是非常关键的。

DBSCAN聚类算法

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法,类似于均值转移聚类算法,但它有几个显著的优点。

                                                                                     DBSCAN笑脸聚类

1:DBSCAN以一个从未访问过的任意起始数据点开始。这个点的邻域是用距离ε(所有在ε距离的点都是邻点)来提取的。

2:如果在这个邻域中有足够数量的点(根据 minPoints),那么聚类过程就开始了,并且当前的数据点成为新聚类中的第一个点。否则,该点将被标记为噪声(稍后这个噪声点可能会成为聚类的一部分)。在这两种情况下,这一点都被标记为“访问(visited)”。

3:对于新聚类的第一个点,其ε距离的附近的点也会成为同一聚类的一部分。这一过程使得在ε邻近的所有点都属于同一聚类,然后重复所有刚刚添加到聚类组的新点。

4:步骤2和步骤3的过程将被重复。知道聚类中的所有的点都被确定,就是说聚类附近的所有的点都被访问或标记。

5:一旦我们完成了当前的所有聚类,就会检索并处理一个新的未被访问的点,这将导致进一步的聚类或者噪声被发现。这个过程不断的重复直到所有的点都被标记或者是访问。因为在所有的点被访问之后,每一个点都会被标记为一个聚类或者是噪声。

优势:他不需要一个预设的聚类数量,他还能将异常值识别为噪声,而不像均值偏移类算法,即使数据点不同,他还会将他们放到一个聚类中(说白了就是不能识别噪声),此外他还能找到很好的任意大小和任意形状的聚类。

缺点:当聚类具有不同的密度的时候,他的性能不像其他聚类算法表现的优秀。因为当密度发生变化时候,距离阈值ε和识别临近点的minpoints的设置会随着聚类的不同变化而变化。这种情况会出现在线在非常高维的数据中,因为距离阈值 ε 变得难以估计。

 

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

K-Means的一个主要缺点是他对聚类中心的平均值使用的太过简单幼稚。可以通过下面的图片来体现这一点。先来看看左边的两个同心圆,不同的半径以相同的平均值为中心。K- Means无法处理,因为聚类的均值非常接近。在聚类不是循环的情况下。K-   Means也会失败。这就是作为均值作为聚类中心的结果。

                                                                                K-Means的两个失败案例

高斯混合模型(GMMs)比K-Means更具灵活性。使用高斯混合模型,我们可以假设数据点是高斯分布的;比起说他是循环的,这是一个不那么严禁的假设。这样我们就有两个参数来描述聚类的形状:平均值和标准差!!!!为二维的例子为例,这意味着聚类可以采用任何形状的椭圆形状(因为在x和y方向上都有标准差)。因此,每一个高斯分布都可以归属一个单独的聚类。

为了找到每一个聚类的高斯分布的参数(例如平局值和方差)我们将使用一种叫做期望最大化(EM)的优化算法。看看下面的图表,可以看到高斯混合模型是被拟合到聚类上的。然后我们就可以继续进行期望的过程————使用高斯混合模型实现最大聚类。

                                                                          使用高斯混合模型来期望最大化聚类

1:我们首先选择聚类的数量(如K-Means所做的那样),然后随机初始化每个聚类的高斯分布函数。通过快速查看数据,可以尝试为初始参数提供良好的猜测。注意,在上面的图表中可以看到,这不是完全必要的,因为即使高斯一开始表现的不是很好,但是很快就会被优化了。

2:给定每个聚类的高斯分布,计算每个数据点属于特定聚类的概率,一个点离高斯中心越近,他就越有可能属于哪个聚类。这应该是很直观的,因为有一个高斯分布,我们假设大部分的数据都离聚类中心很近。

2:基于这些概率,我们为高斯分布计算一组新的参数,这样我们就能最大程度上的利用聚类中的数据点的概率,我们使用数据点的位置的加权和累计算这些新的参数,权重是属于该特定聚类中的数据点的概率,为了解释这一点,我们可以看一下上面的图,特别是黄色的聚类作为例子。分布在第一次迭代中是随机的,但是我们可以看到大多数的黄色点都在这个分布的右边。当我们计算一个由概率加权的和,即使在中心附近有一些点,它们中的大部分都在右边。因此,自然分布的均值更接近于这些点。我们还可以看到,大多数点都是“从右上角到左下角”。因此,标准差的变化是为了创造一个更符合这些点的椭圆,从而使概率的总和最大化。

步骤2和3被迭代地重复,直到收敛,在那里,分布不会从迭代到迭代这个过程中变化很多。

优点:首先,高斯混合模型在聚类协方差方面比K-Means要灵活得多;根据标准差参数,聚类可以采用任何椭圆形状,而不是局限于圆形。K-Means实际上是高斯混合模型的一个特例,每个聚类在所有维度上的协方差都接近0。其次,根据高斯混合模型的使用概率,每个数据点可以有多个聚类。因此,如果一个数据点位于两个重叠的聚类的中间,通过说X%属于1类,而y%属于2类,我们可以简单地定义它的类。

层次聚类算法

层次聚类算法实际上分为两类:自上而下或自下而上。自下而上的算法在一开始就将每个数据点视为一个单一的聚类,然后依次合并(或聚集)类,直到所有类合并成一个包含所有数据点的单一聚类。因此,自下而上的层次聚类称为合成聚类或HAC。聚类的层次结构用一棵树(或树状图)表示。树的根是收集所有样本的唯一聚类,而叶子是只有一个样本的聚类。在继续学习算法步骤之前,先查看下面的图表。

                                                                                               合成聚类

1.我们首先将每个数据点作为一个单独的聚类进行处理。如果我们的数据集有X个数据点,那么我们就有了X个聚类。然后我们选择一个度量两个聚类之间距离的距离度量。作为一个示例,我们将使用平均连接(average linkage)聚类,它定义了两个聚类之间的距离,即第一个聚类中的数据点和第二个聚类中的数据点之间的平均距离。

2.在每次迭代中,我们将两个聚类合并为一个。将两个聚类合并为具有最小平均连接的组。比如说根据我们选择的距离度量,这两个聚类之间的距离最小,因此是最相似的,应该组合在一起。

3.重复步骤2直到我们到达树的根。我们只有一个包含所有数据点的聚类。通过这种方式,我们可以选择最终需要多少个聚类,只需选择何时停止合并聚类,也就是我们停止建造这棵树的时候!

层次聚类算法不要求我们指定聚类的数量,我们甚至可以选择哪个聚类看起来最好。此外,该算法对距离度量的选择不敏感;它们的工作方式都很好,而对于其他聚类算法,距离度量的选择是至关重要的。层次聚类方法的一个特别好的用例是,当底层数据具有层次结构时,你可以恢复层次结构;而其他的聚类算法无法做到这一点。层次聚类的优点是以低效率为代价的,因为它具有O(n³)的时间复杂度,与K-Means和高斯混合模型的线性复杂度不同。

 

聚类算法的原理以及算法流程。

KMeans算法在给定一个数k之后,能够将数据集分成k个“簇”C={C1,C2,⋯,Ck}C={C1,C2,⋯,Ck},不论这种分类是否合理,或者是否有意义。算法需要最小化平方误差:

其中

x是簇Ci的均值向量,或者说是质心。其中‖x−μi‖2代表每个样本点到均值点的距离(其实也是范数)。这里就稍微提一下距离度量。

距离度量最常用的就是闵可夫斯基距离(亦即p范数),即

当p==2的时候,闵可夫斯基距离即为欧氏距离(2范数)
当p==1的时候,闵可夫斯基距离即为曼哈顿距离(1范数 或者叫 cityblock distance)

以上是对于数值属性来说的,对于一些离散属性也有相关的距离的定义。最后在现实中的数据如果要确定合适的距离计算式,可以通过“距离度量学习”来实现。

也就是说上面的式(1)的目的就是我们要找到 k个簇,使得在每个簇内,所有的样本点都尽量靠得比较近。

下面介绍KMeans的基本算法流程

输入:样本数据集 D,聚类簇数 k

(1)从样本中随机选取k个样本点作为初始的均值向量{u1,u2,u3,,,uk}

(2)循环一下步骤直到达到停止条件;

         (2.1)令Ci=∅(1≤i≤k)

         (2.2)对所有样本点计算他们到k和均值向量之间的距离。取其中距离最短的距离对应的均值向量的标记座位该点的簇标记,然后将该点加入该 簇Ci。

           (2.3)对每一个簇计算他们的新的均值向量,

(3)如果相比之前的向量有变化,就更新,将其作为新的均值向量,如果没有变化就不变。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

https://blog.csdn.net/yingchundexiaoxiong/article/details/88959127

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值