作者:桂。

时间:2017-04-13  19:14:48

链接:http://www.cnblogs.com/xingshansi/p/6702174.html

声明:本文大部分内容来自:刘建平Pinard博客的内容。


前言

  之前对非负矩阵分解(NMF)简单梳理了一下,总觉得NMF与聚类非常相似,像是谱聚类的思想。在此将谱聚类的知识梳理一下,内容无法转载,不然直接转载刘建平Pinard的博文了,常用的谱聚类有RatioCut和Ncut算法,全文主要梳理RatioCut算法:

  1)背景知识;

  2)理论推导;

  3)应用实例

内容为自己的学习记录,其中参考他人的部分,最后一并给出链接。

一、背景知识

关于图的基本概念,以及常用到的拉普拉斯矩阵,之前已经有博文介绍过。直接从图的分割说起:

  A-邻接矩阵

邻接矩阵的构造方法,常用的有KNN、全连接等方法,这里仅以全连接中的高斯核为例:

$W_{ij}=S_{ij}=exp(-\frac{||x_i-x_j||_2^2}{2\sigma^2})$

  B-无向图切图

对于无向图$G$的切图,我们的目标是将图$G(V,E)$切成相互没有连接的k个子图,每个子图点的集合为:$A_1,A_2,..A_k$它们满足$A_i \cap A_j = \emptyset$,且$A_1 \cup A_2 \cup ... \cup A_k = V$。

对于任意两个子图点的集合$A, B \subset V$,$A \cap B =  \emptyset$,我们定义A和B之间的切图权重为:

$W(A, B) = \sum\limits_{i \in A, j \in B}w_{ij}$

那么对于我们k个子图点的集合:$A_1,A_2,..A_k$,我们定义切图cut为:

$cut(A_1,A_2,...A_k) = \frac{1}{2}\sum\limits_{i=1}^{k}W(A_i, \overline{A}_i )$

其中$\overline{A}_i$为${A}_i$的补集。

那么如何切图可以让子图内的点权重和高,子图间的点权重和低呢?一个自然的想法就是最小化$cut(A_1,A_2,...A_k)$,但是可以发现,这种极小化的切图存在问题,如下图:

找到类似图中"Best Cut"这样的最优切图呢?一个自然的想法就是,类似为了防止过拟合而添加正则项一样,可以添加新的限定,这就是谱聚类的思想

二、理论推导(RatioCut)

定义$|A_i|$: = 子集$A_i$中点的个数。现在对每个切图,不光考虑最小化$cut(A_1,A_2,...A_k)$,它还同时考虑最大化每个子图点的个数,即:

$RatioCut(A_1,A_2,...A_k) = \frac{1}{2}\sum\limits_{i=1}^{k}\frac{W(A_i, \overline{A}_i )}{|A_i|}$

那么怎么最小化这个RatioCut函数呢?牛人们发现,RatioCut函数可以通过如下方式表示。

我们引入指示向量$h_j =\{h_1, h_2,..h_k\}\; j =1,2,...k$,对于任意一个向量$h_j$它是一个n维向量(n为样本数),我们定义$h_{ji}$为:

$h_{ji}= \begin{cases} 0& { v_i \notin A_j}\\ \frac{1}{\sqrt{|A_j|}}& { v_i \in A_j} \end{cases}$

借助拉普拉斯矩阵特性,我们对于$h_i^TLh_i$有:

可以看出,对于某一个子图i,它的RatioCut对应于$h_i^TLh_i$,那么我们的k个子图呢?对应的RatioCut函数表达式为:

注意到$H^TH=I$,优化函数转化为:

因为每一个h的取值有两种可能,因此该准则函数需要k*2n种H,这是一个NP难问题

如果对条件适当放松呢?比如这样:

h不再看作只有两种取值的离散变量,而是具有连续取值的变量。

这样一来,上面的优化函数就可以对h利用拉格朗日乘子法进行求解。这种求解方法是瑞利熵求解的一类,关于瑞利熵前文有介绍。因为这里放宽了h的限定,使得h从离散量变为连续量,如何与之前的对应呢?最简单的办法就是看求解的h离h原始的两个取值,哪个更近,对应的就算做哪一类。离哪个更近?没错,这正是Kmeans的思想,故后处理也可以用调Kmeans来完成。Kmeans之前,通常将求解的h每一列分别归一化。

至此完成了RatioCut的步骤。

三、代码实现

首先根据上文的理论分析,给出RatioCut的算法步骤:

步骤一:求解拉普拉斯矩阵L

步骤二:对L进行特征值分解,并取K个最小特征值对应的特征向量(K为类别数目)

步骤三:将求解的K个特征向量(并分别归一化),构成新的矩阵,对该矩阵进行Kmeans处理

Kmeans得到的类别标签,就是原数据的类别标签,至此完成RatioCut聚类。

给出对应代码:

sigma2 = 0.002;
%%Step1: Calculate Laplace matrix
for i = 1:N
for j =1:N
W(i,j) = exp(-sqrt(sum((X(i,:)-X(j,:)).^2))/2/sigma2);
end
end
W = W-diag(diag(W));% adjacency matrix
D = diag(sum(W)); %degree matrix
L = D-W;%laplace matrix
%%Step2:Eigenvalues decomposition
K = 3;
[Qini,V] = eig(L);
%%Step3:New matrix Q
[~,pos] = sort(diag(V),'ascend');
Q = Qini(:,pos(1:K));
Q = Q./repmat(sqrt(diag(Q'*Q)'),N,1);
[idx,ctrs] = kmeans(Q,K);

测试一下,按数据为3类进行谱聚类,可以看出来还是有效的,谱聚类中高斯权重涉及到$\sigma$如何取值,不过这里就不做进一步讨论了。

参考:

谱聚类(Spectral clustering)分析(1)的更多相关文章

  1. 【聚类算法】谱聚类(Spectral Clustering)

    目录: 1.问题描述 2.问题转化 3.划分准则 4.总结 1.问题描述 谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图 ...

  2. 谱聚类(Spectral Clustering)详解

    谱聚类(Spectral Clustering)详解 谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似 ...

  3. 谱聚类 Spectral Clustering

    转自:http://www.cnblogs.com/wentingtu/archive/2011/12/22/2297426.html 如果说 K-means 和 GMM 这些聚类的方法是古代流行的算 ...

  4. 谱聚类算法(Spectral Clustering)优化与扩展

    谱聚类(Spectral Clustering, SC)在前面的博文中已经详述,是一种基于图论的聚类方法,简单形象且理论基础充分,在社交网络中广泛应用.本文将讲述进一步扩展其应用场景:首先是User- ...

  5. 谱聚类算法(Spectral Clustering)

        谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法--将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的 ...

  6. Spectral Clustering

    谱聚类算法(Spectral Clustering)优化与扩展   谱聚类(Spectral Clustering, SC)在前面的博文中已经详述,是一种基于图论的聚类方法,简单形象且理论基础充分,在 ...

  7. 谱聚类(spectral clustering)原理总结

    谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...

  8. 基于谱聚类的三维网格分割算法(Spectral Clustering)

    谱聚类(Spectral Clustering)是一种广泛使用的数据聚类算法,[Liu et al. 2004]基于谱聚类算法首次提出了一种三维网格分割方法.该方法首先构建一个相似矩阵用于记录网格上相 ...

  9. 转:浅谈Spectral Clustering 谱聚类

    浅谈Spectral Clustering Spectral Clustering,中文通常称为“谱聚类”.由于使用的矩阵的细微差别,谱聚类实际上可以说是一“类”算法. Spectral Cluste ...

随机推荐

  1. 每天一个linux命令(38)--lsof命令

    lsof (list open files )是一个列出当前系统打开文件的工具,在Linux 环境下,任何事情都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控 ...

  2. MySQL之乱码问题解决详解

    今天在写一个项目的时候,在数据库中手动插入数据不会产生中文乱码,但是通过javaWeb却出现乱码,把提交表单和响应中的乱码问题解决后,还是乱码.所以我锁定一定是我的mysql数据库中出现了乱码的现象.

  3. web计时机制——performance对象

    前面的话 页面性能一直都是Web开发人员最关注的领域.但在实际应用中,度量页面性能的指标,是提高代码复杂程度和巧妙地使用javascript的Date对象.Web Timing API改变了这个局面, ...

  4. v3学院带您一起学习FPGA

    本文为原创,转载请注明! 课程名称:双buffer乒乓操作项目概况:使用FPGA内部ram作为缓冲器,实现对外部数据流的缓存:为了提升数据的传输及处理速度,在此节课中将用到两个ram进行乒乓操作.结构 ...

  5. tp框架基础(详细步骤分解,易懂)下

    在浏览器中如果要访问操作方法的时候以什么方式来访问 有四种方式 第一种是get方式,第二种是访问路径 这四种方式我们可以通过修改配置文件来改掉url的模式 我们需要来改一下我们的配置文件 在这个路径下 ...

  6. KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架之koahub-body-res

    koahub body res Format koa's respond json. Installation $ npm install koahub-body-res Use with koa v ...

  7. ES3:ElasticSearch 索引

    ElasticSearch是文档型数据库,索引(Index)定义了文档的逻辑存储和字段类型,每个索引可以包含多个文档类型,文档类型是文档的集合,文档以索引定义的逻辑存储模型,比如,指定分片和副本的数量 ...

  8. sed 删除换行符

    sed 删除换行符 sed ':label;N;s/\n/:/;b label' filename sed ':label;N;s/\n/:/;t label' filename 上面的两条命令可以实 ...

  9. iOS性能之WebP

    当今互联网,无论网页还是APP,流量占用最大的,多数都是因为图片,越是良好的用户体验,对图片的依赖度越高.但是图片是一把双刃剑,带来了用户体验,吸引了用户注意,却影响了性能,因为网络请求时间会相对比较 ...

  10. github多用户git push错误remote: Permission to user1/z.git denied to user2

    背景:同一台电脑的public key同时添加到了github的两个账户,导致user1的仓库没法正常提交. 解决办法:为两个账户分别配置ssh key,配置~/.ssh/config文件(windo ...