聚类问题
定义
聚类(Clustering)是最常见的无监督学习算法,它指的是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。
聚类与分类
- 聚类是一种无监督学习,而分类是一种有监督的学习。
- 聚类只需要人工指定相似度的标准和类别数就可以,而分类需要从训练集学习分类的方法。
- 由于分类有标签,因此需要训练和测试数据集来验证创建的模型,但不需要在聚类中训练和测试数据集。
- 与聚类相比,分类更复杂,因为在分类阶段有很多级别,而在聚类中只进行分组。
聚类算法用途
聚类算法应用非常广泛。在面对未知的世界时,先分类,再逐个研究,是人类探索未知世界的一个基本方法。聚类算法可以应用于探索性数据挖掘、统计分析、生物信息学、数据压缩、计算机图像识别、医学影像分析等,在商业领域可以用来做市场研究、商品归类,在社会科学领域可以用来做犯罪区域分析等等。
下图中有一些样本点,我们根据物理距离的远近,把所有的点分成3类。你只需要告诉算法这些信息,算法就可以按照你的要求完成聚类:
- 分类数量为3;
- 分类标准是物理距离;
- 分好的类分别用红、绿、蓝表示。
实际上,除了物理距离,现实生活中任何你能想到、计算机可以通过运算和逻辑进行判断的规则,都可以作为分类标准。如图像压缩、图像分割就是运用计算机运算完成分类划分。
常见的聚类算法
k-means算法
原理
我们假定给定数据样本 X ,包含了 n 个对象 ,其中每一个对象都具有 m 个维度的属性。而 K-means 算法的目标就是将 n 个对象依据对象间的相似性聚集到指定的 k 个类簇中,每个对象属于且仅属于一个其到类簇中心距离最小的类簇中。对于 K-means 算法,首先需要初始化 k 个聚类中心 ,, 然后通过计算每一个对象到每一个聚类中心的欧式距离,如下式所示:
这里的表示第i个对象,表示第 k 个聚类中心,表示第i个对象的第t个属性,表示第k个聚类中心的第t个属性。
依次比较每一个对象到每一个聚类中心的距离,将对象分配到距离最近的聚类中心的类簇中,得到k个类簇,kmeans 算法定义了类簇的原型,类簇中心就是类簇内所有对象在各个维度的均值,其计算公式如下所示:
式中, 表示第t个聚类中心,,表示第l个类簇中对象的个数,表示第l个类簇中第i个对象
k-means的算法流程如下
-
初始化:随机选择k个中心点,作为初始的聚类中心。
-
计算距离:计算每个样本到k个中心点的距离,将各样本划分到距离最近的中心点所在的簇。
-
重新计算中心:为各簇所有点的均值,重新计算各簇的中心。
-
迭代:不断迭代2、3步骤,直到各簇不再发生变化或者达到预设的迭代次数。
k-means算法的优缺点
优点:
-
原理比较简单,实现也是很容易,收敛速度快。
-
当结果簇是密集的,而簇与簇之间区别明显时, 它的效果较好。
-
主要需要调参的参数仅仅是簇数k。
缺点:
-
K值需要预先给定,很多情况下K值的估计是非常困难的。
-
K-Means算法对初始选取的质心点是敏感的,不同的随机种子点得到的聚类结果完全不同 ,对结果影响很大。
-
采用迭代方法,可能只能得到局部的最优解,而无法得到全局的最优解。
层次聚类
原理及基本思想
层次聚类算法通常有两种主要的方法:凝聚(自底向上)和分裂(自顶向下)。
层次聚类算法的基本思想是将数据集构建成一个层次结构,其中每个样本最初表示为一个单独的簇,然后通过计算样本之间的相似度或距离来逐渐将簇合并成更大的簇。整个过程可以表示为一棵树形结构,称为聚类树或者树状图。通过该树状图,我们可以选择合适的切割点来确定最终的聚类结果。
凝聚层次聚类
凝聚层次聚类从每个样本作为一个单独的簇开始,然后在每个步骤中合并最相似的簇,直到达到所需的聚类数或者只剩下一个簇。该算法的主要步骤如下:
- 初始化:将每个样本视为一个簇。
- 计算相似度/距离:根据某种相似度或距离度量方法计算任意两个样本之间的相似度或距离。
- 合并:合并相似度/距离最小的簇,形成新的簇。
- 更新相似度/距离矩阵:根据实际合并情况更新相似度/距离矩阵。
- 重复:重复步骤3和4,直到只剩下一个簇或达到所需的聚类数。
分裂层次聚类
分裂层次聚类从所有样本作为一个簇开始,然后在每个步骤中选择一个簇并将其分裂成更小的簇,直到达到所需的聚类数或者每个簇包含一个样本。该算法的主要步骤如下:
- 初始化:将所有样本视为一个簇。
- 计算相似度/距离:根据某种相似度或距离度量方法计算任意两个样本之间的相似度或距离。
- 选择簇:选择一个需要分裂的簇,通常是其中包含样本数最多的簇。
- 分裂:将选择的簇分裂成更小的簇,形成新的簇。
- 更新相似度/距离矩阵:根据实际分裂情况更新相似度/距离矩阵。
- 重复:重复步骤3~5,直到达到所需的聚类数或每个簇只包含一个样本。
总结
层次聚类算法是一种常用的无监督学习算法,通过构建一个层次结构来划分数据集。凝聚层次聚类将样本逐渐合并成更大的簇,而分裂层次聚类则是将整个数据集分裂成更小的簇。这两种方法都可以根据实际问题选择合适的算法来进行聚类。
密度聚类
DBSCAN算法
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种典型的基于密度的空间聚类算法。和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集。该算法将具有足够密度的区域划分为簇,并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。
该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其他空间对象)的数目不小于某一给定阈值。DBSCAN算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意形状的空间聚类。但是当空间聚类的密度不均匀、聚类间距差相差很大时,聚类质量较差。
DBSCAN算法的若干概念
DBSCAN算法步骤
输入:样本集D=(x1,x2,...,xm),邻域参数(ϵ,MinPts), 样本距离度量方式
输出: 簇划分C.
1.初始化核心对象集合Ω=∅, 初始化聚类簇数k=0,初始化未访问样本集合Γ = D, 簇划分C = ∅
2.对于j=1,2,…m, 按下面的步骤找出所有的核心对象:
a) 通过距离度量方式,找到样本xj的ϵ-邻域子样本集Nϵ(xj)
b) 如果子样本集样本个数满足|Nϵ(xj)|≥MinPts, 将样本xj加入核心对象样本集合:Ω=Ω∪{xj}
3.如果核心对象集合Ω=∅,则算法结束,否则转入步骤4.
4.在核心对象集合Ω中,随机选择一个核心对象o,初始化当前簇核心对象队列Ωcur={o}, 初始化类别序号k=k+1,初始化当前簇样本集合Ck={o}, 更新未访问样本集合Γ=Γ−{o}
5.如果当前簇核心对象队列Ωcur=∅,则当前聚类簇Ck生成完毕, 更新簇划分C={C1,C2,...,Ck}, 更新核心对象集合Ω=Ω−Ck, 转入步骤3。否则更新核心对象集合Ω=Ω−Ck。
6.在当前簇核心对象队列Ωcur中取出一个核心对象o′,通过邻域距离阈值ϵ找出所有的ϵ-邻域子样本集Nϵ(o′),令Δ=Nϵ(o′)∩Γ, 更新当前簇样本集合Ck=Ck∪Δ, 更新未访问样本集合Γ=Γ−Δ, 更新Ωcur=Ωcur∪(Δ∩Ω)−o′,转入步骤5.
输出结果为: 簇划分C={C1,C2,…,Ck}
谱聚类
原理
谱聚类是从图论中演化出来的算法,后来在聚类中得到了广泛的应用。它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。
算法流程
输入:样本集D=,相似矩阵的生成方式, 降维后的维度, 聚类方法,聚类后的维度
输出: 簇划分.
1. 根据输入的相似矩阵的生成方式构建样本的相似矩阵S
2.根据相似矩阵S构建邻接矩阵W,构建度矩阵D
3.计算出拉普拉斯矩阵L
4.构建标准化后的拉普拉斯矩阵
5.计算最小的个特征值所各自对应的特征向量
6.将各自对应的特征向量组成的矩阵按行标准化,最终组成维的特征矩阵F
7.对F中的每一行作为一个维的样本,共n个样本,用输入的聚类方法进行聚类,聚类维数为
8.得到簇划分
总结
谱聚类可以理解为先降维,再聚类,谱聚类的算法原理的确简单,代码实现比较容易。但是要完全理解,需要对图论中的无向图,线性代数和矩阵分析都有一定的了解。