关于距离,K-means,层次聚类,密度聚类以及谱聚类

目录

相似度/距离

k-Means算法

衡量聚类(轮廓系数)

层次聚类

密度聚类

谱聚类


之前博客中讲的模型基本上都是分类以及回归模型,他们都是属于有监督学习的,意为所有的样本都有一个结果值提供,我们所要做的就是在原有结果值的指导(监督)下使机器拟合结果,从而学习规律。而聚类是无监督学习,就是指没有一个结果值的提供。聚类本身需要做的是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大类别间的数据相似度较小。

相似度/距离

那么如何判断两个样本之间的距离或者是相似度呢。

最简单想法就是

闵可夫斯基距离(Minkowski):

dist(X,Y)=\left ( \sum_{i=1}^{n}\left | x_{i}-y_{y} \right |^{p} \right )^{\frac{1}{p}}

当p为1时即曼哈顿距离,也就是L1norm。p为2时为欧氏距离,也就是L2norm

闵可夫斯基距离主要是以空间中两点的距离作为度量。而如果我们想把样本表达成向量以他们的角度为相似性的度量,我们就可以用

余弦相似度(cosine similarity):

cos(\theta )=\frac{a^{T}b}{\left | a \right |\cdot \left | b \right |}
在实际的应用时,我们经常会把数据做标准化,

皮尔逊相似系数(Pearson)就是把两组数据标准化处理之后的向量夹角的余弦。


\rho _{XY}=\frac{cov(X,Y)}{\sigma _{X}\sigma _{Y}}=\frac{\sum_{i=1}^{n}(x_{i}-\mu_{x})(y_{i}-\mu_{y})}{\sqrt{\sum_{i=1}^{n}(x_{i}-\mu_{x})^{2}}\sqrt{\sum_{i=1}^{n}(y_{i}-\mu_{y})^{2}}}

而当样本可以表达为集合的时候(比如推荐清单,购买清单等),我们则可以使用

杰卡德相似系数(Jaccard) 来表达样本间的相似性:

J(A,B)=\frac{\left |A\cap B \right |}{\left | A\cup B \right |}

对于分类问题我们通常使用相对熵(K-L距离)

D(p||q)=E_{p(x)}log\frac{p(x)}{q(x)}

k-Means算法

k-Means算法,也被称为k-平均或k-均值,是一种广泛使用的聚类算法,或者成为其他聚类算法的基础。 
假定输入样本为S=x_{1},x_{2}...x_{n},则算法步骤为:


选择初始的k个类别中心\mu _{1},\mu _{2},...\mu _{k}

对于每个样本x;,将其标记为最近类别中心距离的类别,即: 
label_{i}=argmin\left \| x_{i}-\mu _{j} \right \|
将每个类别中心更新为隶属该类别的所有样本的均值

\mu _{j}=\frac{1}{\left | c_{j} \right |}\sum_{i\in c_{j}}x_{i}


重复最后两步,直到类别中心的变化小于某阈值。

中止条件:

迭代次数/簇中心变化率/最小平方误差MSE(Minimum Squared Error) 

整个过程类似下图:

关于距离,K-means,层次聚类,密度聚类以及谱聚类_第1张图片

k-Means将簇中所有点的均值作为新质心,若簇中含有异常点,将导致均值偏离严重。以一维数据为例: 
数组1、2、3、4、100的均值为22,显然距离 “大多数”数据1、2、3、4比较远 
改成求数组的中位数3,在该实例中更为稳妥。 
这种聚类方式即k-Mediods聚类(K中值距离)

k-means同时本身是初值敏感的,因为本身他相当于使用平方误差作为目标函数。所以可能会有局部最小值,本身聚类的过程是类似于梯度下降的,当达到局部最小值的时候就停止迭代了。所以初值选择不同,最后下降达到的位置也有可能不同。

一种方法是多次选择初值,多次尝试选择最优值,另外一种类似于我们解决传统梯度下降使用随机梯度下降法,k-Means每次选择此类别的部分样本做新类别中心位置的运算,这种算法叫做Mini-batch k-Means。

k-Means的优点: :
是解决聚类问题的一种经典算法,简单、快速

对处理大数据集,该算法保持可伸缩性和高效率

当簇近似为高斯分布时,它的效果较好 


缺点:
在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用。

必须事先给出k(要生成的簇的数目),而且对初值敏感,对于不同的初始值,可能会导致不同结果。 

不适合于发现非凸形状的簇或者大小差别很大的簇

对躁声和孤立点数据敏感 


一般k-Means可作为其他聚类方法的基础算法,如谱聚类等等。

衡量聚类(轮廓系数)

那么我们一般如何衡量一哥聚类的好坏呢。

Silhouette系数是对聚类结果有效性的解释和验证,由Peter J. Rousseeuw于1986提出。

计算样本i到同簇其他样本的平均距离ai。ai越小,说明样本i越应该被聚类到该簇。将ai称为样本i的簇内不相似度。 

簇C中所有样本的ai均值称为簇C的簇不相似度。

计算样本i到其他某簇Cj的所有样本的平均距离bij,称为样本i与簇Cj的不相似度。bi为其中的最小值,定义为样本i的簇间不相似度。

bi越大,说明样本i越不属于其他簇。

根据样本i的簇内不相似度ai和簇间不相似度bi,定义样本i的轮廓系数:

s(i)=\frac{b(i)-a(i)}{max(a(i),b(i))}


si接近1,则说明样本i聚类合理;si接近-1,则说明样本i更应该分类到另外的簇。若si近似为0,则说明样本i在两个簇的边界上。 
所有样本的si的均值称为聚类结果的轮廓系数,是该聚类是否合理、有效的度量。 

层次聚类

层次聚类方法对给定的数据集进行层次的分解,直到某种条件满足为止。具体又可分为: 


凝聚的层次聚类:AGNES(AGglomerative NESting)算法 
一种自底向上的策略,AGNES算法最初将每个对象作为一个簇,然后这些簇根据某些准则被一步步地合并。两个簇间的距离由这两个不同簇中距离最近的数据点对的相似度来确定;聚类的合并过程反复进行直到所有的对象最终满足簇数目。


分裂的层次聚类:DIANA(DIvisive ANAlysis)算法 
采用自顶向下的策略,DIANA 算法是上述过程的反过程,属于分裂的层次聚类,首先将所有的对象初始化到一个簇中,然后根据一些原则(比如最大的欧式距离),将该簇分类。直到到达用户指定的簇数目或者两个簇之间的距离超过了某个阈值。 

对于簇与簇之间的距离,一般有以下几种方法:

最小距离 
两个集合中最近的两个样本的距离prime,容易形成链状结构 

最大距离
两个集合中最远的两个样本的距离complete

平均距离 
1、两个集合中样本间两两距离的平均值average

2、两个集合中样本间两两距离的平方和ward 

效果如下:关于距离,K-means,层次聚类,密度聚类以及谱聚类_第2张图片

密度聚类

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

这类算法能克服基于距离的算法只能发现“类圆形”(凸)的聚类的缺点,可发现任意形状的聚类,且对噪声数据不敏感。但计算密度单元的计算复杂度大,需要建立空间索引来降低计算量。

DBSCAN(Density-Based Spatial Clustering ofApplications with Noise) 是一个比较有代表性的基于密度的聚类算法。与划分和层次聚类方法不同,它将簇定义为密度相连的点的最大集合,能够把具有足够高密度的区域划分为簇,并可在有“噪声”的数据中发现任意形状的聚类。

先介绍几个概念:

对象的\varepsilon邻域:给定对象在半径s内的区域。

核心对象:对于给定的数目m,如果一个对象的\varepsilon邻域至少包含m个对象,则称该对象为核心对象。

直接密度可达:给定一个对象集合D,如果p是在q的\varepsilon邻域内,而q是一个核心对象,我们说对象p从对象q出发是直接密度可达的。 

密度可达:如果存在一个直接密度可达链,使p可以达到q,则q是从p密度可达的。

密度相连:如果对象集合D中存在一个对象o,使得对象p和q是从o密度可达的,那么对象p和q是密度相连的。 

簇:一个基于密度的簇是最大的密度相连对象的集合。

噪声:不包含在任何簇中的对象称为噪声。 

整个算法流程为:

如果一个点p的\varepsilon邻域包含多于m个对象,则创建一个p作为核心对象的新簇。

寻找并合并核心对象直接密度可达的对象,没有新点可以更新簇时,算法结束。


由上述算法可知: 

每个簇至少包含一个核心对象。

非核心对象可以是簇的一部分,构成了簇的边缘(edge)。

包含过少对象的簇被认为是噪声。 

类似下图:

关于距离,K-means,层次聚类,密度聚类以及谱聚类_第3张图片

关于一个点的局部密度有以下定义:

截断值

\rho _{i}=\sum_{j}\chi (d_{ij}-d_{c})

其中

\chi (x)=\left\{\begin{matrix} 1 &x<0 \\ 0&otherwise \end{matrix}\right.

d_{c}是一个截断距离,意为计算密度时小于这个距离的都算作1。大于算为0.

高斯核相似度

\rho _{i}=\sum_{j\in I_{S}}exp(-(\frac{d_{ij}}{d_{c}})^{2})

K近邻均值:

\rho _{i}=\frac{1}{K}\sum_{j=1}^{K}d_{ij}

然后我们定义

高局部密度点距离\delta _{i}=min_{j:\rho _{j}>\rho _{j}}(d_{ij})

即在密度高于对象i的所有对象中,到对象i最近的距离,即高局部密度点距离。
对于密度最大的对象,设置\delta _{i}=max(d_{ij}))(即:该问题中的无穷大)。
只有那些密度是局部或者全局最大的点才会有远大于正常值的高局部密度点距离。 只

然后那些有着比较大的局部密度\rho _{i}和很大的高密距离\delta _{i}的点被认为是簇的中心

高密距离\delta _{i}较大但局部密度\rho _{i}较小的点是异常点。

通过下图我们可以直观的了解:

关于距离,K-means,层次聚类,密度聚类以及谱聚类_第4张图片

确定簇中心之后,其他点按照距离已知簇的中心最近进行分类,也可按照密度可达的方法进行分类。 注:也可按照密度可达的方法进行分类.

这种聚类方法也叫密度最大值聚类。我们同时也可以使用此方法对于K-means做初值。

谱聚类

方阵作为线性算子,它的所有特征值的全体统称方阵的
方阵的谱半径为最大的特征值 
矩阵A的谱半径:(A^{T}A)的最大特征值 


谱聚类是一种基于图论的聚类方法,通过对样本数据的拉普拉斯矩阵特征向量进行聚类,从而达到对样本数据聚类的目的。 

整体过程:

给定一组数据x_{1},x_{2}...x_{n},记任意两个点之间的相似度(“距离”的减函数)为S_{ij}=< x_{i},x_{j}>,形成相似度图(similarity graph): G=(V,E)。如果x_{i}x_{j}之间的相似度S_{ij}大于一定的阈值,那么,两个点是连接的,权值记做S_{ij} 

接下来,可以用相似度图来解决样本数据的聚类问题:找到图的一个划分,形成若干个组(Group),使得不同组之间有较低的权值,组内有较高的权值。 接下来,可以用相似度图来解决样本数据的聚类问题:找到图的一个划分,形成若干个组(组),使得不同组之间有较低的权值,组内有较高的权值。

对于无向图G=(V,E)

邻接矩阵W=(S_{ij})i,j=1,...,n。i=j时为0

度矩阵D为对角阵:

d_{i}=\sum_{j=1}^{n}S_{ij}

拉普拉斯矩阵L即为L=D-W

L为半正定矩阵,最小特征值是0,相应特征向量为全1向量。

有了拉普拉斯矩阵即可以看到任意点之间的相似度,及距离远近,0表示没有任何相似性(无穷远)

还有的算法提供正则拉普拉斯矩阵:

对称拉普拉斯矩阵L_{sym}=D^{-\frac{1}{2}}\cdot L\cdot D^{\frac{1}{2}}=I-D^{-\frac{1}{2}}\cdot W\cdot D^{\frac{1}{2}}

随机游走拉普拉斯矩阵L_{rw}=D^{-1}\cdot L=I-D^{-1}W

然后计算L的前k个特征向量u_{1},u_{2}....u_{k}
将k个列向量u_{1},u_{2}....u_{k}组成矩阵U,U∈R(n×k)

对于i=1,2,....n,令y_{i}∈R(k)是U的第i行的向量

随机游走中还需要将y单位化。

使用k-means算法将点(y_{i}),i=1.2...n聚类成簇C1,C2.…Ck ; 

输出簇A1,A2....Ak,其中,A_{i}=\left \{ j|y_{j}\in C_{i} \right \}

谱聚类是将样本之间的相似度做成矩阵,然后使用类似PCA降维的思路,由特征向量以及特征值找出k个影响最大的特征。然后按照特征进行聚类。

你可能感兴趣的:(机器学习,聚类算法,模型评估,聚类算法,kmeans算法,机器学习)