聚类算法汇总
聚类算法汇总
标签(空格分隔): 机器学习
作为无监督领域(unsupervised)一个太过famous的算法了,聚类(clustering)就是对大量未知标注的数据集,按照数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小. 然而,里面仍然有很多需要注意的地方,对于聚类本身,目前也有很多改进版本了,所以还是需要总结一下的。
相似度的度量
各种相似度的度量方式及其相关性见我的这篇博客。
K-means算法
这个算法大家都熟,跟KNN是兄弟,简单实用易操作,它也是其他一些聚类算法的鼻祖。
具体的步骤为:
对于输入样本\(D = x_{1}, x_{2}, x_{3}, ... ,x_{m}\):
- 选择初始的K个class center \(\mu_{1}, \mu_{2},...,\mu_{K}\);
- 对于每个样本\(x_{i}\),将其标记为距离类别中心最近的类别,即: \(y_{i} = argmin_{1\le j \le K}||x_{i} - \mu_{j}||\);
- 将每个类别中心更新为隶属该类别的所有样本的均值:
\(\mu_{j} = \frac{1}{|c_{j}|\sum_{i \in c_{j}}x_{i}}\);
4.重复上述两步,直至算法收敛。
收敛条件为:迭代次数/簇中心变化率/最小平方误差MSE(Minimum Squared Error)
\(E = \sum_{i=1}^{k}\sum_{x \in C_{i}}||x - \mu_{i}||_{2}^{2}\)
簇类个数怎么定?
- 根据先验经验:如果我们事先已经知道类的类的个数,直接设置即可。
- 增加交叉验证;
初始的簇类中心怎么定?
K-means对初始值敏感,有可能会陷入局部最优解,可以优化如下:
- 先随机给定1个点,然后计算所有点到这个样本点的距离,距离越大的样本被选中做第二个中心点的概率大,距离越小的样本被选中的概率小;
- 这样便有了2个簇类中心点。然后计算所有样本到这两个中心点的距离,选择其他样本点到这两个样本点中较近的距离作为衡量标准。距离越大被选中的概率越大;
- 这样便有了3个簇类中心点。做法依然同上,知道选出k个簇类中心。
(这样做并不能完全使所有所有的中心店刚好取在不同的簇类中,但是可以一定程度上避免很多样本点取自同一个簇。而在实践中,为了计算方便,可以直接按照距离来计算 —— 随机选择一个点,然后选其他中心点时如果选中的点距离该样本点的距离小于某个阈值,则放弃。)
K-means是一个解决聚类问题的经典算法,简单有效,但不太适合于发现非凸形状的簇或者大小差别很大的簇,对噪声和孤立点比较敏感。
层次聚类
层次聚类是对给定数据集进行层次的分解,直到满足一定的条件。
- 凝聚的层次聚类:AGNES算法。一种自底向上的策略,首先将每个对象作为一个簇,然后依次合并那些原子簇使之形成更大的簇,直到满足一定条件;
- 分裂的层次聚类:DIANA算法。一种自顶向下的策略,首先将所有对象置于一个簇中,然后逐渐细分为越来越小的簇,直到满足一定条件。
聚类过程如图所示:
密度聚类
密度聚类又称基于密度的聚类(Density-based clustering),此算法假设聚类结构能通过样本分布的紧密程度确定。其中,最著名的而一种算法叫做DBSCAN算法(Density-Based Spatial Clustering of Application with Noise).
假设给定数据集\(D = {x_{1}, x_{2},...,x_{m}}\),给出以下概念:
- \(\epsilon\)-邻域:对于\(x_{j}\in D\),其邻域包含样本即D中与\(x_{j}\)的距离不大于\(\epsilon\)的样本,即\(N_{\epsilon}(x_{j}) ={{ x_{i}\in D | dist(x_{i}, x_{j}) \le \epsilon }}\);
- 核心对象(core object):若\(x_{j}\)的\(\epsilon\)-邻域至少包含MinPts个样本,则\(x_{j}\)是一个核心对象;
- 密度直达(directly density-reachable):若\(x_{j}\)位于\(x_{i}\)的\(\epsilon\)-邻域中,且\(x_{i}\)是核心对象,则称\(x_{j}\)由\(x_{i}\)密度直达;
- 密度相连(density-connected):对\(x_{i}\)与\(x_{j}\),若存在\(x_{k}\)使得\(x_{i}\)与\(x_{j}\)均由\(x_{k}\)密度可达,则称\(x_{i}\)与\(x_{j}\)密度相连。
算法流程:
- 如果一个点p的\(\epsilon\)-邻域包含多于m个对象,则创建一个p作为核心对象的新簇;
- 寻找并合并核心对象直接密度可达的对象;
- 没有新点可以更新簇时,算法结束。
谱聚类
- 谱:方针作为线性算子,它的所有特征值的全体统称为方针的谱;
-
- 方阵的谱半径为最大的特征值;
-
- 矩阵A的谱半径:\((A^{T}A)\)的最大特征值。
- 谱聚类是一种基于图论的聚类方法,通过对样本数据的拉普拉斯矩阵的特征向量进行聚类从而达到对样本数据聚类的目的。
假设给定一组数据\(x_{1}, x_{2},...,x_{n}\),记任意两点之间的相似度为\(s_{ij} = <x_{i}, x_{j}>\),形成相似度图(similarity graph):\(G = <V, E>\),如果\(s_{ij}\)大于一定的阈值,则两点是相连的,无向图中这两点之间的权值记作\(s_{ij}\);
下面用相似度图来解决样本数据的聚类问题:找到一个图的划分,形成若干个组,使得不同组之间有较低的权值,组内有较高的权值。
- 给定无向图\(G = <V, E>\),则可以得到它的邻接矩阵\(W = (w_{ij})_{i,j=1,...,n}\),(设置主对角线元素为0);
- 若两个点的相似度值越大,表示这两个点越相似;
- 定义\(w_{ij} = 0\)表示\(v_{i}, v_{j}\)两个点灭有任何相似性;
- 顶点的度di形成度矩阵D(是一个对角阵):\(d_{i} = \sum_{j=1}^{n}w_{ij}\)
- W的第i行元素的和为\(v_{i}\)的度;
- 除主对角线元素,D的其他位置为0
- 未正则的拉普拉斯矩阵:L = D - W
- 正则的拉普拉斯矩阵:
- 对称拉普拉斯矩阵\(L_{sym} = D^{-\frac{1}{2}}·L·D^{\frac{1}{2}} = I - D^{-\frac{1}{2}}·W·D^{\frac{1}{2}}\)
谱聚类算法
输入:n个点\({p_{i}},簇的数目为k\)
- 计算n * n的相似度矩阵W和度矩阵D;
- 计算拉普拉斯矩阵L = D - W;
- 计算L的前k个特征向量\(u_{1}, u_{2}, ... ,u_{k}\);
- 将k个列向量\(u_{1}, u_{2}, ... ,u_{k}\)组成矩阵\(U,U \in R^{n*k}\);
- 对于\(i = 1,2,...,n\),令\(y_{i}\in R^{k}\)是U的第i行的向量;
- 使用k-meas算法将点\((y_{i})_{i=1,2,..,n}\)聚类成簇\(C_{1}, C_{2}, ..., C_{k}\);
- 输出簇\(A_{1}, A_{2},...,A_{k}\),其中,\(A_{i} = \{j|y_{i} \in C_{i}\}\)
谱聚类算法有点像降维算法哦。
可以使用正则化的拉普拉斯矩阵代替算法中未正则过的。