谱聚类(Spectral clustering)(2):NCut

news/2024/7/7 23:10:38

作者:桂。

时间:2017-04-13  21:19:41

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

声明:欢迎被转载,不过记得注明出处哦~


前言

本文为谱聚类的第二篇,主要梳理NCut算法,关于谱聚类的更多细节信息,可以参考之前的博文:

  1)拉普拉斯矩阵(Laplace Matrix)与瑞利熵(Rayleigh quotient)

  2)谱聚类之RatioCut算法

内容主要参考刘建平Pinard博客,更多细节可以参考该作者博文,本文最后给出代码实现,全文包括:

  1)NCut原理

  2)NCut算法实现

 

一、NCut原理

  Ncut切图和RatioCut切图很类似,但是把Ratiocut的分母$|Ai|$换成$vol(A_i)$,由于子图样本的个数多并不一定权重就大,我们切图时基于权重也更合我们的目标,因此一般来说Ncut切图优于RatioCut切图。

$vol(A): = \sum\limits_{i \in A}d_i$

对应的,Ncut切图对指示向量h做了改进。注意到RatioCut切图的指示向量使用的是$\frac{1}{\sqrt{|A_j|}}$标示样本归属,而Ncut切图使用了子图权重$\frac{1}{\sqrt{vol(A_j)}}$来标示指示向量h,定义如下:

那么我们对于$h_i^TLh_i$有:

推导方式和RatioCut完全一致。也就是说,我们的优化目标仍然是

但是此时我们的$H^TH \neq I$而是$H^TDH = I$,推导如下:

也就是说,此时我们的优化目标最终为:

这个就是泛化瑞利熵的求解问题,之前文章分析过。这里再次给出细节分析。

令$H = D^{-1/2}F$,则优化目标转化为:

至此已经完成了NCut的理论。

画蛇添足一下吧,注意到:

 

事实上,连拉普拉斯矩阵都懒得构造了。

 

二、NCut算法实现

首先给出算法步骤:

步骤一:求解邻接矩阵W和度矩阵D

步骤二:对${D^{ - \frac{1}{2}}}W{D^{ - \frac{1}{2}}}$进行特征值分解,并取K个最大特征值对应的特征向量(K为类别数目)

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

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

给出代码实现:

sigma2 = 0.01;
%%Step1: Calculate  matrixs
for i = 1:Nfor j =1:NW(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
%%Step2:Eigenvalues decomposition
K = 3;
[Q,V] = eigs(D^(-1/2)*W*D^(-1/2),K);
%%Step3:New matrix Q
Q = Q./repmat(sqrt(diag(Q'*Q)'),N,1);
[idx,ctrs] = kmeans(Q,K); 

结果图:

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

参考:

  • http://www.cnblogs.com/pinard/p/6221564.html

转载于:https://www.cnblogs.com/xingshansi/p/6706400.html


http://lihuaxi.xjx100.cn/news/242507.html

相关文章

LSB图像信息隐藏算法matlab,实验二LSB信息隐藏实验.doc

实验二LSB信息隐藏实验.doc实验二LSB信息隐藏实验综合评分:【实验目的】:掌握MATLAB基木操作实现LSB信息隐藏和提取【实验内容】:(请将你实验完成的项11涂“■“)实验完成形式:■用MATLAB函数实现LSB信息隐藏和提取□其它:(请注明…

java培训:什么是抽象类?怎么定义?

什么是抽象类?怎么定义?这是属于java技术里面的一个知识点,本期教程就是围绕这个问题做的相关介绍,当定义一个类时,常常需要定义一些成员方法描述类的行为特征,但有时这些方法的实现方式是无法确定的。例如,在定义An…

python的turtle绘图体系入门必看(二)

1 turtle画笔控制函数 画笔操作后一直有效,一般成对出现 turtle.penup() 别名 turtle.pu() 画笔抬起,海龟在飞行(不在画布上留下图案) turtle.pendown() 别名 turtle.pd() 画笔落下,海龟在爬行 turtle.pensize(width) 别名 turtle.width(wi…

回调函数设计方法

引入:你显示器不亮了,你不知道怎么弄,那你就问在外地干IT的大表哥,你大表哥告诉你修理的方法,然后需要你自己来操作。你大表哥知道怎么弄,但是自己不去弄,而是由你去弄。换句话说,你…

DSL概述

为什么80%的码农都做不了架构师?>>> DSL探讨的问题 DSL本身只是一层为了表达的能力而做的浅浅封装,在你考虑DSL的时候你应该将绝大部分的精力花在构建语义模型上,但反过来说DSL的设计从某种程度上来说帮你理清了语义模型的需求&a…

Python数字类型及操作汇总(入门级)

1. 整数类型 2. 浮点数类型 带有小数点及小数的数字 取值范围和精度都有限制,但常规计算可忽略不计(基本无限制) 注意:浮点数运算存在不确定尾数(不是bug,一般发生在10-16左右,因为计算机内部用二进制表示&#xff0c…

php -find(),php – beforeFind()添加条件

使用beforeFind(),如果希望find使用它,则应返回已修改的$queryData数组.这是你目前的问题.public function beforeFind($queryData) {parent::beforeFind();$queryData[conditions] array(client_id > 2);return $queryData;}但是,您还有其他一些小问题可能会导致您遇到问题…

女生学软件测试有哪些优势

对于软件测试这个岗位,相信大家都有听说过,最近几年,越来越多的女性加入到互联网技术行业,选择最多的岗位就是软件测试,那么到底女生学软件测试有哪些优势呢?来看看下面的详细介绍。 女生学软件测试有哪些优势?首先咱…