机器学习:聚类

Posted zhuchengchao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习:聚类相关的知识,希望对你有一定的参考价值。

聚类算法

简介

聚类就是对大量未知标注的数据集,按照数据内部存在的数据特征将数据集划分为多个不同的类别,使类别内的数据比较相似,类别之间的数据相似度比较小;属于无监督学习

聚类算法的重点是计算样本项之间的相似度,有时候也称为样本间的距离

相似度/距离

闵可夫斯基距离

[ dist(X,Y)=quadsqrt[p]{sum_{i=1}^{n}{|x_i-y_i|^p}} ]

[ 其中X=(x_1,x_2,...,x_n),Y=(y_1,y_2,...,y_n) ]

  • 当p是1的时候为哈曼顿距离(Manhattan)/城市距离:

    • [ dist(X,Y)=sum_{i=1}^{n}{|x_i-y_i|} ]
  • 当p为2的时候为欧式距离(Euclidean):

    • [ E\\_dist(X,Y)=sqrt{sum_{i=1}^{n}{|x_i-y_i|^2}} ]
  • 当p为无穷大的时候是切比雪夫距离(Chebyshew):

    • [ C\\_dist(X,Y)=max(|x_i-y_i|) ]

    有数学性质可得,当p为无穷大时,有如下:
    [ dist(X,Y)=quadsqrt[p]{sum_{i=1}^{n}{|x_i-y_i|^p}} ]

    [ leqquadsqrt[p]{n imes max(|x_i-y_i|^p)}=max(|x_i-y_i|) imesquadsqrt[p]{n} ]

    [ ≈max(|x_i-y_i|) ]

标准化欧氏距离

标准化欧氏距离是针对欧氏距离的缺点而作的一种改进,即将数据的各维分量都“标准化”到均值、方差相等,即均值为0方差为1 。
[ 现有两个n维向量:a(x_{11}, x_{12}, ...,x_{1n}),b(x_{21}, x_{22}, ...,x_{2n}) ]

[ 使各维数据满足标志正态分布:x_i^{′}=frac{x_i-overline{x_i}}{s_i},i表示维度 ]

[ 欧式距离计算:dist_{12}=sqrt{sum_{i=1}^{n}{(frac{x_{1i}-x_{2i}}{s_i})^2}} ]

夹角余弦相似度

通过计算两个向量的夹角余弦值来评估他们的相似度。

有两个n维向量如下:
[ a(x_{11}, x_{12}, ...,x_{1n}),b(x_{21}, x_{22}, ...,x_{2n}) ]

[ cos(θ)=frac{sum_{k=1}^{n}{x_{1k}x_{2k}}}{sqrt{sum_{k=1}^{n}{x_{1k}^2}} imessqrt{sum_{k=1}^{n}{x_{2k}^2}}}=frac{a^Tcdot b}{|a||b|} ]

KL距离

KL距离,也叫做相对熵。它衡量的是相同事件空间里的两个概率分布的差异情况,计算公式如下:
[ D(P||Q)=sum_x{P(x)log frac{P(x)}{Q(x)}} ]
参考:KL距离

Jaccard相似系数

杰卡德相似系数:用于比较有限样本集之间的相似性与差异性,Jaccard系数值越大,样本相似度越高,计算公式如下:
[ J(A,B)=frac{|A∩B|}{|A∪B|} ]

[ dist(A,B)=1-J(A,B)=frac{|A∪B|-|A∩B|}{|A∪B|} ]

Pearson相关系数

Pearson相关系数是用来衡量两个数据集合是否在一条线上面,它用来衡量定距变量间的线性关系;

计算公式如下:
[ ρ_{XY}=frac{Cov(X,Y)}{sqrt{D(X)} sqrt{D(Y)}}=frac{E[(X-E(X))(Y-E(Y))]}{sqrt{D(X)} sqrt{D(Y)}} ]

[ =frac{sum_i^n{(X_i-μ_X)(Y_i-μ_Y)}}{sqrt{sum_i^n{(X_i-μ_X)^2}} imessqrt{sum_i^n{(Y_i-μ_Y)^2}}} ]

[ dist(X,Y) = 1-ρ_{XY} ]

聚类

基本思想:

  • 根据具有M个对象的数据集,构件一个具有k个簇的模型,合理的将这M个对象进行划分,其中满足如下条件:
    • 每个簇中至少包含一个对象;
    • 每个对象有且仅属于一个簇;
  • 大致流程:对于给定的类别数目k,首先给定初始划分,通过迭代改变样本和簇的隶属关系,使的每次处理后得到的划分方式比上一次的好。

K-means

算法流程

k-means作为聚类的最广泛,最基础的算法,大致流程如下:

假设有输入样本:
[ T=X_1,X_2,...,X_m ]

  1. 随机选择K个样本作为初始聚类中心,例如:

[ K个簇中心:a_1, a_2, ..., a_k ]

[ 每个簇样本数量:N_1, N_2,...,N_k ]

  1. 对于每个样本,从上述K个聚类中心中寻找距离最近的一个,并且把该数据标记为属于该聚类;
  2. 在所有的样本都被标记完成后,根据每个聚类中的样本,更新聚类中心;
  • 使用MSE作为目标函数时,如下:

[ J(a_1, a_2, ..., a_k)=frac{1}{2}sum_{j=1}^{K}{sum_{i=1}^{N_j}{(vec{x_i}-vec{a_j})^2}} ]

  • 要获取最优解,也就是使得目标函数要尽可能的小,对J求偏导,可得簇中心点a 的更新公式为:

[ frac{?J}{?a_j}=frac{1}{2}frac{?sum_{i=1}^{N_j}{(vec{x_i}-vec{a_j})^2}}{?a_j} ]

[ =-sum_{i=1}^{N_j}{(vec{x_i}-vec{a_j})} ]

[ 令上式为0,得vec{a_j}=frac{1}{N_j}sum_{i=1}^{N_j}{vec{x_i}} ]

  1. 重复2,3两步操作,知道达到某个终止条件

终止条件:迭代次数、MSE、簇中心点的变化率

存在问题

  • K-means在迭代过程中使用所有点的均值作为新的中心点,若簇中存在异常值,将导致均值出现偏差

    可通过K-Mediods聚类(K中值聚类)解决

  • K-means存在初值敏感问题,选择不同的初始值可能会导致最终划分的簇不同

优点

  • 容易理解,效果还行;
  • 处理大数据集时,该算法可以保证较好的伸缩性和高效率;
  • 当簇近似高斯分布的时候,效果很好。

二分K-Means算法

二分K-Means算法是一种弱化初始质心的一种算法,一定程度上解决了K-Means算法对初始簇心比较敏感的问题。

思路:

  1. 将所有样本数据作为一个簇放到一个队列中;
  2. 从队列中选择一个簇进行K-means算法划分,划分为两个子簇后添加到队列中;
  3. 继续第2步操作,直到达到终止条件(聚簇数量、MSE、迭代次数)
  4. 队列中的簇就是最终的分类簇集合

划分方式:

从队列中选择划分聚簇的规则一般有以下两种方式:

  • 选择样本数量最多的簇进行划分
  • 对所有的簇计算误差和SSE(SSE簇内误差平方和,也可以认为是距离函数的一种变种),选择SSE最大的居村进行划分操作(优先选择这策略)

[ SSE=sum_{i=1}^{n}{w_i(vec{x_i}-vec{a_{x_{ui}}})} ]

K-means++

也是为了解决K-means算法对初始簇心敏感问题,K-means++在选择初始的K个簇心时,并不是和K-means一样随机选择,而是采用以下步骤进行选择:

  1. 从数据集中任选一个节点作为第一个聚类的中心;
  2. 对数据集中的每个样本点,计算x到所有已确定的聚类簇心点的距离D(X),基于D(X)采用线性概率选择出下一个聚类中心点(距离较远的一个点成为新增的一个聚类中心点);
  3. 重复2步骤,直到选择出K个聚类中心点。

缺点

k-means++ 最主要的缺点在于其内在的顺序执行特性,得到 k 个聚类中心必须遍历数据集 k 次,并且当前聚类中心的计算依赖于前面得到的所有聚类中心,这使得算法无法并行扩展,极大地限制了算法在大规模数据集上的应用。

K-means||

解决了K-means++算法的缺点,其主要思路如下:

  • 改变了每次遍历时的取样规则;
  • 并非按照K-means++算法每次在遍历时只获取一个样本,而是每次获取K个样本
  • 重复取样操作logn次,可得到k*logn个样本点组成的集合;
  • 然后再将这些抽样出来的样本聚类出K个点;
  • 最后用这K个点作为K-means的初始簇心。

实践证明,一般5此重复采样就可以保证一个比较好的聚簇中心点

Canopy

Canopy算法为一种相对“粗”的聚类算法,执行速度快,但进度较低。

执行步骤:

  1. 给定样本列表(L=x_1,x_2,...,x_m),和先验值(r_1,r_2(r_1>r_2));

  2. 从列表L中选择一节点P,计算P到所有簇中心的距离,并选择出最小距离(D(P, a_j))

    若此时还不存在簇中心,则该P点为一个新的簇

  3. 若距离D小于(r_1),表示该节点属于该聚簇,添加到该聚簇列表中;

  4. 若距离D小于(r_2),表示该节点不仅仅属于该聚簇,还表示和当前聚簇中心非常近,所以将该聚的中心点设置为该簇中所有样本的中心点,并将P从列表L中删除;

  5. 如距离D大于(r_1),那么该节点P形成一个新的聚簇;

  6. 一直迭代到列表L中的元素数据不再有变化/元素个数为0的时候,结束循环操作。

Canopy算法最终得到的结果,聚簇之间是可能存在重叠的,但是不存在某个对象不属于任何聚簇的情况

应用场景

由于K-means存在初始聚簇中心敏感问题,因此常使用Canopy+K-means算法混合形式进行模型构建

  • 先使用Canopy算法进行“粗”聚类,得到K个聚类中心点;
  • K-means使用Canopy得到的K个聚类中心点作为初始的中心点,进行“细”聚类

此方法的优点如下:

  • 执行速度快(先进行了一次聚簇中心点选择的预处理);
  • 不需要给定K值,应用场景多;
  • 能缓解K-means算法对于初始聚类中心敏感问题。

Mini Batch K-means

该算法是K-means的一种变种,采用了mini-batch的方式,即每次训练时使用的数据集是从样本集中随机抽取出来的子集,此方式可以减少计算的时间与收敛时间,而最终的效果只是略差于标准的K-means算法。

步骤如下:

  1. 抽取部分数据集,使用K-Means算法构建出K个聚簇点的模型;
  2. 继续在训练集中抽取部分样本数据,添加到模型中,进行分配;
  3. 更新聚簇中心;
  4. 循环迭代,知道中心点稳定或达到迭代次数,停止计算操作。

聚类衡量指标

均一性

一个簇中只包含一个类别的样本,则满足均一性;可认为是正确率(每个聚簇中正确分类的样本占据该聚簇总样本数的比例);
[ p=frac{1}{K}sum_{k=1}^{K}{frac{N(C_k==K_k)}{N(K_k)}} ]

完整性

同类别样本被归类到相同簇总,满足完整性;每个聚簇中正确分类的样本数占该类型的总样本数比例和
[ r=frac{1}{K}sum_{k=1}^{K}{frac{N(C_k==K_k)}{N(C_k)}} ]

V-measure

均一性完整性的加权平均
[ v_eta=frac{(1+eta^2)cdot pr}{eta^2cdot p+r} ]

轮廓系数

簇内不相似度:

计算样本(X_i)到同簇其他样本的平均距离,令其为(a_i),该值越小,表示该样本越应该被聚类到该簇中;簇(C_k)中的所有样本的(a_i)均值被称为簇(C_k)的簇内不相似度。

簇间不相似度:

计算样本(X_i)到其他簇样本的平均距离,记为(b_ik),去除最小值:
[ b_i=min(b_{i1}, b_{i2}, ..., b_{iK}) ]
(b_i)越大,表示样本(X_i)越不属于其他簇。

轮廓系数

[ s(i) = frac{b_i-a_i}{max(a_i,b_i)} ]

[ =egin{cases} 1-frac{a_i}{b_i},a_i<b_i\\ 0, a_i=b_i\\ frac{a_i}{b_i}-1,a_i>b_iend{cases} ]

可得当(s(i))的值越接近1表示样本i聚类越合理;越接近-1,表示样本(X_i)应该被分类到其他的簇中;近似为0,说明(X_i)在边界上;

所有样本的(s(i))的均值为聚类结果的轮廓系数

其他的衡量指标:

  • 调整兰德系数(ARI) ,不常见,略
  • 调整互信息(AMI) ,不常见,略

层次聚类

层次聚类对于给定的数据集进行层次分解,直到满足某种条件为止,传统层次聚类主要分为两大类算法:

AGNES

AGNES,agglomerative NESting,凝聚的层次聚类;采用自底向上的策略;

agglomerative:凝聚

nesting:嵌套

  • 将每个对象作为一个簇;
  • 根据某些准则(两个簇之间的相似度度量方式),将簇一步步合并;
  • 反复进行合并过程,直到满足终止条件(簇的数目)。

某些准则

在AGNES算法中,在合并簇时,依靠的是某些准则来计算簇间的距离,有如下几种方式:

  • 最小距离(SL聚类)
    • 两个聚簇中最近的两个样本之间的距离(single/word-linkage聚类法)
    • 最终得到的模型容易形成链式结构
  • 最大距离(CL聚类)
    • 两个聚簇中最远的两个样本之间的距离(complete-linkage聚类法)
    • 如果存在异常值,那么结构可能不太稳定
  • 平均距离(AL聚类)
    • 两个聚簇中样本间两两距离的平均值(average-linkage聚类法)
    • 两个聚簇中样本间两两距离的中值(median-linkage聚类法)

DIANA

DIANA,DIvisive ANALysis,分裂的层次聚类,采用自顶向下的策略;

divisive:分裂

analysis:分析

  • 将所有的对象置于一个簇中;
  • 按照某种规则逐渐细分为越来越小的簇;
  • 直到达到某个终止条件。

某种规则:

  • 各自簇的误差;
  • 各自簇的SSE;
  • 选择样本数量最多的簇;

和二分K-Means算法中的划分依据相同,可参考上方相应章节。

AGNES和DIANA特点

  • 简单,容易理解;

  • 合并点/分裂点选择不容易;

  • 合并/分类的操作不能进行撤销;

  • 大数据集不太适合:执行效率较低,其时间复杂度为:(O(t imes n^w))

    时间复杂度O(n)

BIRCH

brich:平衡迭代消减聚类法,聚类特征使用3元祖表示一个簇的相关信息,通过构建满足分支因子类直径限制的聚类特征树来求聚类;

  • 3元祖:(N,LS,SS),其中N代表这个簇中拥有的样本点的数量;LS代表了这个簇中拥有的样本点各特征维度的和(向量),SS代表了这个簇中拥有的样本点各特征维度的平方和(向量)
  • 分支因子:规定了树的每个节点的最大子节点数,超过后需要进行分裂;
  • 类直径:每个簇直径的最大阈值,当超过后,则作为一个新的簇;

特点:

  • 适合大规模数据集,线性效率;

树的构建是动态过程,可随时根据数据对模型进行更新

  • 只适合分布呈凸形或者球形的数据集,需要给定簇之间的相关参数(分支因子和类直径),聚类个数可给可不给
    • 当给定聚类个数时:先生成树,根据聚类个数合并叶子节点;
    • 未给定聚类个数时:直接生成树

CURE

Clustering Using Representatives,使用代表点的聚类法,该算法先把每个数据点看成一个簇,然后合并距离最近的簇直到簇的个数满足要求;这似乎和AGNES的算法相同,当然存在区别:

AGNES:使用所有点/中心点+距离代表一个簇;

CURE:从簇中选择固定的数目的,分布较好的最能代表该簇的点来作为此类簇的代表,并将这些代表点乘上收缩因子,使其更加靠近簇中心;

特点:

  • 每类簇有多于一个的代表点使得模型可以匹配那些非球形的场景;
  • 收缩因子的使用可以减少噪音对聚类的影响 ;
  • 针对大型数据库,CURE采用随机取样和划分两种方法的结合:一个随机样本首先被划分,每个划分被部分聚类。

稍作了解:)

密度聚类

密度聚类思想:只要样本点的密度大于某个阈值,则将该样本添加到最近的簇中。

特点:

  • 这类算法可以克服基于距离的算法只能发现凸聚类的缺点,可以发现任意形状的聚类,而且对噪声数据不敏感;
  • 但是计算复杂度搞,计算量大。

DBSCAN

DBSCAN,Density-Based Spatial Clustering of Applications with Noise,一个比较有代表性的基于密度的聚类算法,相比于基于划分的聚类方法和层次聚类方法,DBSCAN算法将簇定义为密度相连的点的最大集合,能够将足够高密度的区域划分为簇,并且在具有噪声的空间数据上能够发现任意形状的簇。

核心思想:

? 用一个点的ε领域内的邻居点数衡量该点所在空间的密度,该算法可以找出形状不规则的簇,且不需要事先指定好簇的数量。

一些概念:

  • ε领域:给定对象在半径ε内的区域

[ N_ε(x)={y∈X:dist(x,y)leq ε },X样本集 ]

  • 密度(density):ε领域中x的密度,是一个整数值,依赖于半径ε

[ p(x)=|N_ε(x)| ]

  • 阈值M:定义核心点时的阈值
  • 核心点(core point):对应于稠密区域内部的点,如下

[ 若p(x) geq M,则称x为X的核心点; ]

[ 记由X中所有核心点构成的集合为X_c;记X_{nc}=X-X_c表示由X中所有非核心点构成的集合 ]

  • 边界点(border point):若非核心点x的领域ε中存在核心点,那么认为x为X的边界点;由X中所有边界点构成的集合为(X_{bd});即,边界点对应于稠密区域边缘的点;

[ x∈X_{nc};?y∈X;y∈N_ε(x)∩X_c ]

  • 噪声点(noise point):集合中除了边界点和核心点之外的点都为噪声点,所以的噪声点组成的集合为(X_{noi}),即,噪声点对应稀疏区域的点;
    [ X_{noi}=X-(X_c∪X_{bd}) ]

  • 直接密度可达(directly density-reachable):给定一个对象集合X,如果y是在x的ε领域内,且x为核心对象,那么可以说对象y从对象x出发时直接密度可达的;

[ x,y∈X;x∈X_c,y∈N_ε(x) ]

  • 密度可达(density-reachable):如果存在一个对象链(p_1,p_2,...,p_m),如果满足(p_{i+1})是从(p_i)直接密度可达的,那么称(p_m)是从(p_1)密度可达的;
  • 密度相连(density-connected):在集合X中,若存在一个对象o,使得对象x和y均由o密度可达,则称x与y密度相连
  • 簇(cluster):一个基于密度的簇是最大的密度相连对象的集合C;满足以下两个条件:
    • 最大性(Maximality):若x属于C,且y是从x密度可达的,那么y也属于C;
    • 连接性(Connectivity):若x属于C,y也属于C,则x和y是密度相连的。

算法流程

  • 若一个点x的ε领域包含多于m个对象,则创建一个x作为核心对象的新簇;
  • 寻找并合并核心对象直接密度可达的对象;
  • 没有新点可以更新簇的时候,算法结束。

算法特征描述

  • 每个簇至少包含一个核心对象;
  • 非核心对象可以是簇的一部分,构成簇的边缘;
  • 包含过少对象的簇被认为是噪声

优缺点

  • 优点:
    • 不需要事先给定cluster的数目;
    • 可以发现任意形状的cluster;
    • 能够找出数据中的噪音,且对噪音不敏感;
    • 算法只需要两个输入参数,ε领域值和m阈值;
    • 聚类结果几乎不依赖节点的遍历顺序;
  • 缺点:
    • DBSCAN算法聚类效果依赖距离公式的选取,最常用的距离公式为欧几里得距离;但是对于高维数据,由于维数太多,距离的度量已经变的不是那么重要;
    • DBSCAN算法不适合数据集中密度差异很小的情况。

密度最大值算法

MDCA(Maximum Density Clustering Application)算法基于密度的思想引入划分聚类中,使用密度而不是初始点作为考察簇归属情况的依据,能够自动确定簇数量并发现任意形状的簇;另外MDCA一般不保留噪声,因此也避免了阈值选择不当情况下造成的对象丢弃情况。

基本思路:寻找最高密度的对象和它所在的稠密区域;MDCA算法在原理上来讲,和密度的定义没有关系,采用任意一种密度定义公式均可,一般情况下采用DBSCAN算法中的密度定义方式。

基本概念

  • 最大密度点:

[ x_{max}={x|x∈X;?y∈X,density(x)geq density(y)} ]

  • 有序序列:根据所有对象与(x_{max})的距离对数据重新排序

[ S_{x_{max}}={x_1,x_2,...,x_n | dist(x_{max},x_1) leq dist(x_{max},x_2)leq ... leq dist(x_{max},x_n) } ]

  • 密度阈值(density_0):当节点的密度值大于密度阈值的时候,认为该节点属于一个比较固定的簇,在第一次构建基本簇的时候,就将这些节点添加到对应簇中,如果小于这个值的时候,暂时认为该节点为噪声节点。

  • 簇间距离:对于两个簇(C_1)(C_2)之间的距离,采用两个簇中最近节点之间的距离作为簇间距离:
    [ dist(C_1,C_2)=min(dist(p,q));p∈C_1,q∈C_2 ]

  • 聚簇距离阈值(dist_0):当两个簇的簇间距离小于给定阈值的时候,这两个簇的结果数据会进行合并操作;

  • M值:初始簇中最多数据样本的个数

算法步骤:

  • 将数据集划分为基本簇:
    • 选择数据集中最大密度点(x_{max}),形成以最大密度点为核心的新簇(C_i),按照距离排序计算出序列(S_{x_{max}}),对序列的前M个样本数据进行循环判断,如果节点的密度大于等于(density_0),那么将当前节点添加到(C_i)中;
    • 循环处理剩下的数据集X,选择最大密度点(X_max),并构建基本簇(C_{i+1}),直到X中剩余的样本数据的密度均小于(density_0)
  • 使用凝聚层次聚类思想,合并较近的基本簇,得到最终的簇划分:
    • 合并要求:簇间距离小于等于(dist_0),若无此情况,则不需要合并操作
  • 处理剩余点,归入最近的簇
    • 最常用,最简单的方式是:将剩余的样本对象归入到最近的簇

谱聚类

谱聚类(Spectral Clustering)算法介绍

挖坑,等有需求了再来好好理解一下:)

案例代码

  • 00_KMeans聚类应用;

  • 01_案例一:K-Means算法聚类;

  • 02_案例二:K-Means算法和Mini Batch K-Means算法比较;

  • 03_案例三:K-Means算法和Mini Batch K-Means算法效果评估;

  • 04_案例四:层次聚类(AGNES)算法采用不同距离计算策略导致的数据合并不同形式;

  • 05_案例五:层次聚类(BIRCH)算法参数比较;

  • 06_案例六:密度聚类(DBSCAN)算法案例;

  • 07_案例七:谱聚类(SC)算法案例;

    未运行,未理解

  • 08_综合案例一:不同聚类算法的比较;

  • 09_综合案例二:基于K-Means算法进行图片压缩;

GitHub

以上是关于机器学习:聚类的主要内容,如果未能解决你的问题,请参考以下文章

spark机器学习-聚类

机器学习中分类与聚类的本质区别

机器学习简易入门 - 聚类

机器学习论文大全,涵盖深度学习计算机视觉分类聚类机器人学等

Python机器学习——DBSCAN聚类

Python机器学习--聚类