作者:桂。

时间:2017-04-14   06:22:26

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

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


前言

之前梳理了一下非负矩阵分解(Nonnegative matrix factorization, NMF),主要有:

  1)准则函数及KL散度

  2)NMF算法推导与实现

  3)拉格朗日乘子法求解NMF(将含限定NMF的求解 一般化)

谱聚类可以参考之前的文章:

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

  2)谱聚类(Spectral clustering)(1):RatioCut

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

总感觉NMF跟聚类有联系,这里试着从聚类角度分析一下非负矩阵分解,主要包括:

  1)Kmeans与谱聚类

  2)对称非负矩阵分解(symmetric NMF,SyNMF);

  3)非对称非负矩阵分解;

内容为自己的学习总结,如果有不对的地方,还请帮忙指出。文中多有借鉴他人的地方,最后一并给出链接。

一、Kmeans与谱聚类

  A-Kmeans定义

,准则函数为:

可以重写为:

定义h:

$n_k$为第k类样本的个数,则准则函数变为:

从而Kmeans的优化问题,等价于:

  B-Kmeans与谱聚类(Spectral clustering)的联系

上文给出了h的定义:

回顾谱聚类中RatioCut定义h的思路:

回顾RatioCut求解问题:

可以看出求解的思路完全一致,不同的是RatioCut是拉普拉斯矩阵L,而Kmeans是矩阵$X^TX$。正因为这点不同,Kmeans在利用谱聚类的思路求解时,略有差别。利用Kmeans的思想求Kmeans,听着这不是欠揍吗? 这里只是为了分析谱聚类一般方法(L)与谱聚类对应的Kmeans($X^TX$)二者的不同。

再次写出RatioCut的步骤:

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

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

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

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

对应Kmeans呢?是不是把$X^TX$换成L就等价于对原数据Kmeans?

步骤一:求解$X^TX$

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

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

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

对应测试code:

  1. L = X'*X;% matrix
  2. %%Step2:Eigenvalues decomposition
  3. K = 3;
  4. [Qini,V] = eig(L);
  5. %%Step3:New matrix Q
  6. [~,pos] = sort(diag(V),'ascend');
  7. Q = Qini(:,pos(1:K));
  8. Q = Q./repmat(sqrt(diag(Q'*Q)'),N,1);
  9. [idx,ctrs] = kmeans(Q,K);

我们可以利用数据测试一下:

再来看看直接对原数据Kmeans的结果:

利用谱聚类的思想求解,得出了错误的分类结果,而直接Kmeans效果是理想的。

原因何在?问题就出在矩阵L上。回顾之前提到的拉普拉斯矩阵L特性:

它表示的是不同数据点特征的差距,而$X^TX$呢?

更像是一种余弦距离的测度,普通的Kmeans自然不能很好解决聚类。其实对$X^TX$利用谱聚类,特征向量子空间是严谨的,以三类为例,将特征子空间投影到二维,如下图中间所示,很容易看出子空间特征是分成三类的,但聚类之后呢?如右图所示,就出现了判别错误。这也是为什么上面两种结果不一致。

总而言之:Kmeans是与谱聚类的思想一致,但由于中间矩阵不同,二者思路略有差异。

   C-Kernel Kmeans与谱聚类

这里就再啰嗦一下,数据分类效果不理想,映射到高维呢?也就是核函数(Kernel function)的思想。

重新写出谱聚类框架下的Kmeans:

对X进行映射:,得出核函数下的Kmeans(Kernel Kmeans)

重新给出code(以kernel 取gaussian为例):

  1. %Kmeans
  2. sigma2 = .02;
  3. L = exp(-dist(X,X').^2*sigma2);
  4. [Qini,V] = eig(L);
  5. %%Step3:New matrix Q
  6. [~,pos] = sort(diag(V),'descend');
  7. Q = Qini(:,pos(1:K));
  8. for i =1:K
  9. Q(:,i) = Q(:,i)-min(Q(:,i));
  10. end
  11. Q = Q./repmat(sqrt(diag(Q'*Q)'),K*N,1);
  12. [idx,ctrs] = kmeans(Q,K);

  对应分类结果:

这个时候分类就理想了。

二、对称非负矩阵分解(SyNMF)

  A-原理介绍

Kmeans与RatioCut的理论框架是统一的,其实准则函数等价为:

现在将$H^TH = I$的约束去掉,泛化后的求解问题为:

这就是对称非负矩阵分解(SyNMF)的思路。

  B-算法求解

求解思路还是利用拉格朗日乘子+KKT,不再细说,给出结果:

泛化后:

得到H之后,如何实现数据的label判别?

可以看出得到的H分为三类,对应三种label, 即可实现数据分离。

给出SymNMF与谱聚类的对比:

对应的code可以点击这里

给出一个测试结果图,测试数据为三类:

三、非对称非负矩阵分解

SymNMF是Spectral clustering的泛化推广。

上文分析的是对称的谱聚类问题:

  • Spectral clustering

  • SymNMF

同样的方式,分析非对称的谱聚类问题:

  • Spectral clustering

该问题可以转化为:

同样的,对于:

进行泛化:

这就是NMF的准则函数,即:

  • NMF

现在来总结一下:

关系是不是一目了然了?如何添加更多约束项呢?比如希望H矩阵尽可能系数等等,就在上面这几类问题的准则函数后添加约束,转化成对偶问题求解即可。

题外话

  A-非负矩阵NMF实现数据聚类

分析了这么多,已经解开了之前的困惑:谱聚类与NMF之间的联系

回顾上面分析Kmeans提到的三类数据聚类问题,对$XX^T$进行NMF处理:

更直观地,将数据放在对应维度观察:

可以看到,由于矩阵对称,即figure对称,对W/H聚类,都可以得到三类标签,从而实现数据的聚类。对于非对称呢?自然想到:如果W对应样本数量维度,则对W进行聚类,如果H对应样本数量维度,就对H进行聚类,同样可以实现数据聚类

给出一个利用(Kernel kmeans)聚类以及利用NMF聚类的对比示例。

利用$X^TX$是kmeans的思路,利用$L$是RatioCut思路,事实上,泛化之后,直接利用$X^TX$也可以利用是NMF的思路。

  

  1. clc;clear all;close all;
  2. N = 100;
  3. K = 3;
  4. X = [randn(N,2)+ones(N,2);...
  5. randn(N,2)+3*ones(N,2);...
  6. randn(N,2)-4*ones(N,2)];
  7. posran = randperm(K*N);
  8. X = X-min(min(X));
  9. X = X(posran,:);
  10.  
  11. %%方法一 基于Data: 利用 XX' + 核心函数
  12. sigma2 = 0.02;
  13. L = exp(-dist(X,X')*sigma2);
  14. %%Step2:Eigenvalues decomposition
  15. [Qini,V] = eig(L);
  16. %%Step3:New matrix Q
  17. [~,pos] = sort(diag(V),'descend');
  18. Q = Qini(:,pos(1:K));
  19. for i =1:K
  20. Q(:,i) = Q(:,i)-min(Q(:,i));
  21. end
  22. Q = Q./repmat(sqrt(diag(Q'*Q)'),K*N,1);
  23. [idx,ctrs] = kmeans(Q,K);
  24. figure
  25. subplot 221
  26. plot(X(:,1),X(:,2),'.');
  27. title('原数据');grid on;
  28. subplot 222
  29. plot3(Q(:,1),Q(:,2),Q(:,3),'b.');
  30. title('特征');grid on;
  31. subplot 223
  32. plot3(Q(idx==1,1),Q(idx==1,2),Q(idx==1,3),'b.');hold on;
  33. plot3(Q(idx==2,1),Q(idx==2,2),Q(idx==2,3),'r.');hold on;
  34. plot3(Q(idx==3,1),Q(idx==3,2),Q(idx==3,3),'g.');hold on;
  35. title('特征聚类');grid on;
  36. subplot 224
  37. plot(X(idx==1,1),X(idx==1,2),'b.');hold on;
  38. plot(X(idx==2,1),X(idx==2,2),'r.');hold on;
  39. plot(X(idx==3,1),X(idx==3,2),'g.');hold on;
  40. title('聚类结果');grid on;
  41. %%方法2 基于NMF: X*X'聚类
  42. %即NMF
  43. Iter = 500;
  44. K = 3;
  45. [W,H] = nmf(X*X',K,Iter);
  46. [idx,ctrs] = kmeans(W,K,'distance','cityblock');
  47. figure
  48. subplot 221
  49. plot(X(:,1),X(:,2),'.');
  50. title('原数据');grid on;
  51. subplot 222
  52. plot3(W(:,1),W(:,2),W(:,3),'b.');
  53. title('W矩阵');grid on;
  54. subplot 223
  55. plot3(W(idx==1,1),W(idx==1,2),W(idx==1,3),'b.');hold on;
  56. plot3(W(idx==2,1),W(idx==2,2),W(idx==2,3),'r.');hold on;
  57. plot3(W(idx==3,1),W(idx==3,2),W(idx==3,3),'g.');hold on;
  58. title('W矩阵聚类');grid on;
  59. subplot 224
  60. plot(X(idx==1,1),X(idx==1,2),'b.');hold on;
  61. plot(X(idx==2,1),X(idx==2,2),'r.');hold on;
  62. plot(X(idx==3,1),X(idx==3,2),'g.');hold on;
  63. title('聚类结果');grid on;

  这里的代码只是为了说明理论问题,代码本身不足以支持应用。给出对应结果图:

基于$X^TX$的Kmeans:

基于$X^TX$的NMF:

事实上,直接对$X$进行NMF聚类,只要将$X^TX$替换为$X$即可,对应结果图:

这里可以理解为:H是对应的字典信息,W是线性变换。

  B-图的聚类(不再是数据的聚类)

上文分析的是对数据点进行分类,如果直接对邻接矩阵、拉普拉斯矩阵,也就是图片信息进行分类呢?(可能有点绕,但数据点聚类,并不代表图就是聚类,图明显可以聚类,对应的数据点也未必可以聚类)。

图对应的矩阵,如拉普拉斯矩阵、邻接矩阵等等,说到底都是figure的表达,如上图所示,因此上文分析的矩阵W/B,可以用图片的信息替代。

对于图的聚类,一种思路是将图中像素点读取,转化成数据格式,再进行聚类。

Data角度就是前面分析的种种类型,Figure角度呢?

给出NMF对图片的处理结果(分四类):

对应code:

  1. img = imread('2.png');
  2. V = 1-im2bw(rgb2gray(img));
  3. figure
  4. K = 4;
  5. Iter = 500;
  6. [W,H] = nmf(V, K, Iter);
  7. subplot 331
  8. mesh(V);
  9. title('原数据')
  10.  
  11. for i =1:K
  12. subplot(3,3,i+1);
  13. mesh(W(:,i)*H(i,:));
  14. title(['分解',num2str(i)])
  15. end

NMF对于Figure是一种线性表达的思路,可以分离的基础是数据不共线(横/纵),再给出之前音乐分离的语谱图:

之所以可以分离正是因为音乐频谱的周期性,所以对于非周期的说话人,直接应用NMF应该是无效的,对应的时域波形:

参考:

  • On the Equivalence of Nonnegative Matrix Factorization and Spectral Clustering
  • Symmetric Nonnegative Matrix Factorization for Graph Clustering

非负矩阵分解(4):NMF算法和聚类算法的联系与区别的更多相关文章

  1. 非负矩阵分解(NMF)原理及算法实现

    一.矩阵分解回想 矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积.对于上述的用户-商品(评分矩阵),记为能够将其分解为两个或者多个矩阵的乘积,如果分解成两个矩阵和 .我们要使得矩阵和 的乘积能够还 ...

  2. 降维、特征提取与流形学习--非负矩阵分解(NMF)

    非负矩阵分解(NMF)是一种无监督学习算法,目的在于提取有用的特征(可以识别出组合成数据的原始分量),也可以用于降维,通常不用于对数据进行重建或者编码. NMF将每个数据点写成一些分量的加权求和(与P ...

  3. Spark MLlib架构解析(含分类算法、回归算法、聚类算法和协同过滤)

    Spark MLlib架构解析 MLlib的底层基础解析 MLlib的算法库分析 分类算法 回归算法 聚类算法 协同过滤 MLlib的实用程序分析 从架构图可以看出MLlib主要包含三个部分: 底层基 ...

  4. 非负矩阵分解NMF

    http://blog.csdn.net/pipisorry/article/details/52098864 非负矩阵分解(NMF,Non-negative matrix factorization ...

  5. 数据降维-NMF非负矩阵分解

    1.什么是非负矩阵分解? NMF的基本思想可以简单描述为:对于任意给定的一个非负矩阵V,NMF算法能够寻找到一个非负矩阵W和一个非负矩阵H,使得满足 ,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积 ...

  6. K-Means 聚类算法原理分析与代码实现

    前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...

  7. 第十三篇:K-Means 聚类算法原理分析与代码实现

    前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...

  8. 转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

    版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...

  9. Standford机器学习 聚类算法(clustering)和非监督学习(unsupervised Learning)

    聚类算法是一类非监督学习算法,在有监督学习中,学习的目标是要在两类样本中找出他们的分界,训练数据是给定标签的,要么属于正类要么属于负类.而非监督学习,它的目的是在一个没有标签的数据集中找出这个数据集的 ...

随机推荐

  1. RHEL 6.0 FTP服务器配置菜鸟配置过程记录

    环境: 虚拟机 RHEL6.0  为了图方便,直接就默认安装了,结果酿成大错,后表~~ 项目:搭建VSFTPD服务器 1.网络ifconfig 配置好,给个IP 2.RPM包或者YUM安装vsftpd ...

  2. 第28篇 js中let和var

      let与var 在js中声明一个变量除了一个var 还有一个let的声明.对于var 在前面的作用域中已经讲过,这次主要说下二者的区别: 在MDN上有这样的一个demo: var list = d ...

  3. jpush 延迟推送的栗子

    这个 推送是上个月做的, 上线之后没有问题,所以,我就把 这个整套代码 整理一哈,方便以后使用. 首先需求是这样的:  在比赛结束后的 10 钟 开始给 参加比赛的球员  发送消息,告诉他们比赛的信息 ...

  4. C++ 11 学习3:显示虚函数重载(override)

    5.显示虚函数重载 在 C++ 里,在子类中容易意外的重载虚函数.举例来说: struct Base { virtual void some_func(); }; struct Derived : B ...

  5. 锋利的jQuery事件

    一:事件 1.鼠标事件 (1)$()是$(document)的简写,默认参数是document. $(function(){}是$(document).ready(function(){})的简写. ...

  6. MacOS无法登录App Store修复

    MacOS无法登录App Store修复 2017-03-10 21:13:39  by:SemiconductorKING 先上图: 惨红色的提示信息,把你拒之App Store门外,但是对之放弃. ...

  7. node c++多线程插件 第一天 c++线程相关函数

    因为不会c++,今天主要是学习了一下c++的东西,感觉非常麻烦. 目前知道了c++里创建线程createThread,返回一个内核对象(HANDLE),我的理解是,c++中系统层面上的操作(线程,文件 ...

  8. [lua] mac上如何编译snapshot(检测Lua中的内存泄露)

    最近我们的unity手游频繁闪退,只要进入战斗场景,之后一段时间就会闪退,如果是在unity编辑器中则会报出not enough memory的错误!猜测应该是有内存泄漏: 由于我们使用了tolua, ...

  9. QT 的使用及编写代码遇到的问题和解决方法

    QT 中将 QString 转化为 const char * 的问题 我开始的代码是这样的: QString qstr = "abcdef"; const char * cc = ...

  10. jsp想js,action传值

    1.struts2 action如何向JSP的JS函数传值 action中定义变量 public class TestAction extends ActionSupport implements S ...