前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >学习笔记 | 非负矩阵分解(NMF)浅析

学习笔记 | 非负矩阵分解(NMF)浅析

作者头像
全栈程序员站长
发布于 2022-09-13 07:33:28
发布于 2022-09-13 07:33:28
4K02
代码可运行
举报
运行总次数:2
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

学习笔记 | 非负矩阵分解[NMF]浅析

概要: 这篇博客和博客 学习笔记|主成分分析[PCA]及其若干应用学习笔记|独立成分分析(ICA, FastICA)及应用 属于一个系列,简单地介绍非负矩阵分解(Non-negative Matrix Factorization, NMF)。 关键字: 非负矩阵分解; NMF

1 背景说明

非负矩阵分解问题涉及的面很广很多,这里只通过一个例子简单理解它的概念和物理意义。这道题是从知乎上看到的,现摘录如下:

题目的要求如下图,其中如2-digits这张图,图中每两个数字构成一个子图(横着看,比如第一行为41,43,42,14,12,14,23,41),对应的右图为左图的一个主成分元素,即2-digits这张图中的每个单一的数字都是一个主成分,要求利用主成分分析等方法将图中的数字一一分离出来,如右图所示。

图1 2-digits NMF练习题

2 NMF简介

非负矩阵分解(Non-negative Matrix Factorization, NMF)的基本思想可以简单描述为:对于任意给定的一个非负矩阵V,NMF算法能够寻找到一个非负矩阵W和一个非负矩阵H,使得 V=W*H 成立 ,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。

NMF本质上说是一种矩阵分解的方法,它的特点是可以将一个大的非负矩阵分解为两个小的非负矩阵,又因为分解后的矩阵也是非负的,所以也可以继续分解。NMF的应用包括但不限于提取特征、快速识别、基因和语音的检测等等。

NMF算法自于1999年由Lee和Seung发表于Nature后便广泛应用于各个场景。从矩阵空间的角度分析,NMF的意义在于在原空间中寻找一组新基底并将原数据投影到该基底上去。原非负矩阵V对应原空间中的原数据,分解之后的两个非负矩阵W和H分别对应寻找得到的新基底和投影在新基底上的数值。

不妨假设原n维实数空间中有m个数据,将其排列成一个n*m的矩阵V,则NMF的任务就变成在该n维实数空间中寻找k个n维基向量(n-vector),排成n*k矩阵W,将m个n维数据分别投影到这k个n-vector上,得到一组新的m个k维数据,记作k*m矩阵H。因此,整个NMF的公式可以写作:

V(n*m) = W(n*k)*H(k*m)

以上内容可以用图2的一页PPT表示:

图1 2-digits NMF练习题

为了帮助读者清晰直观地理解NMF算法的实现原理,以二维空间中四个数据的变换为例讲解矩阵分解和线性空间中的线性变换的原理,如图2所示。

图2 以二维空间为例说明线性空间中的线性变换

需要注意的是,图2并不能完全表明NMF的工作原理。非负矩阵分解的关键是“非负”,即原数据和新基底都必须是非负数,或者说位于“第一象限”,这样原数据投影在新基底上的数值才自然也是非负数。而图2中的四个数据中的C和D明显就不是非负数,同样基底j也不位于第一象限,所以上图的关键是介绍矩阵的分解,也就是线性空间中的线性变换方法。

下面用数学语言对NMF进行描述,并直接给出求解NMF的迭代公式,如图3所示。

图3 NMF的数学描述和求解迭代公式

如图3所示,NMF的本质是通过一个矩阵去求解两个为止矩阵。图3采用的是迭代法,一步步逼近最终的结果,当计算得到的两个矩阵W和H收敛时,就说明分解成功。需要注意的是,原矩阵和分解之后两个矩阵的乘积并不要求完全相等,可以存在一定程度上的误差。

如果要在计算机中实现NMF,则可以根据如图4所示的步骤进行。

图4 NMF算法步骤

3 核心代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function [W,H,iternum,distance] = myNMF(V,k,epsilon,itermax)
%MYNMF - The Non-negative Matrix Factorization algorithm.
%   To do the NMF for matrix V. The formula is shown as follows:
%   V(n*m) = W(n*k)*H(k*m)
%   For example, (n,m,k) = (4096,64,8) or (2048,128,4).
% 
%   Here are some message about NMF with the URL as follows:
%   https://zhuanlan.zhihu.com/p/27460660
%   https://blog.csdn.net/pipisorry/article/details/52098864
%
%   [W,H] = myNMF(V,epsilon,iternum)
% 
%   Input - 
%   V: the n*m data matrix, m n-vectors arranging by columns;
%   k: the number of basis vectors;
%   epsilon: error of distance between V and V' of two iterations;
%   itermax: iteration number upper limit.
%   Output - 
%   W : the n*k basis matrix, k n-vectors;
%   H : the k*m coefficient matrix, each columns are obtained by 
%       projecting each column of V matrix onto W matrix;
%   iternum : the number of interations consumed to meet epsilon;
%   distance : final distance between 2 metrics V and W*H after
%              iternum times of interations.
% 
%   Copyright (c) 2018 CHEN Tianyang
%   more info contact: tychen@whu.edu.cn

%% pre-work
% n is the number of dimension, m is the number of n-vectors
[n,m] = size(V);
% initialize W and H
W_init = rand(n,k);
H_init = rand(k,m);
H_old = H_init;
W_old = W_init;
H_new = zeros(k,m);
W_new = zeros(n,k);
% some prepare variables
dist = zeros(itermax,1);
count = 2;
dist(count) = 100;
error = realmax;

%% iterate
% iterate as the following formula:
% 1. H_new(i,j) = H_old(i,j)*(W_old'*V)(i,j)/(W_old'*W_old*H_old)(i,j)
% 2. W_new(i,j) = W_old(i,j)*(V*H_old')(i,j)/(W_old*H_old*H_old')(i,j)
while error >= epsilon
    % update matrix H
    Hcoematx_up = (W_old')*V;
    Hcoematx_dn = (W_old')*W_old*H_old;
    for i=1:k
        for j=1:m
            if Hcoematx_dn(i,j)==0
                H_new(i,j) = H_old(i,j);
            else
                H_new(i,j) = H_old(i,j)*Hcoematx_up(i,j)/Hcoematx_dn(i,j);
            end
        end
    end
    % update matrix W
    % (?用Hold就是HW同步更新,用Hnew就是HW先后更新,怎么选)
    Wcoematx_up = V*(H_old)';       
    Wcoematx_dn = W_old*H_old*(H_old)';
    for i=1:n
        for j=1:k
            if Wcoematx_dn(i,j)==0
                W_new(i,j) = W_old(i,j);
            else
                W_new(i,j) = W_old(i,j)*Wcoematx_up(i,j)/Wcoematx_dn(i,j);
            end
        end
    end
    % calculate the difference between two iteration approximation matrices 
    dist(count) = sum(sum( (W_new*H_new-W_old*H_old).^2) );
    error = abs(dist(count)-dist(count-1));
    if mod(count,1000)==0
        fprintf('%d轮迭代误差为%d.\n',count,dist(count));
    end
    % The results of this round of iteration
    if count-1 == itermax
        fprintf('%d轮迭代已毕,误差仍未收敛.\n',itermax);
        break;
    end
    % prepare for the next round of round
    H_old = H_new;
    W_old = W_new;
    count = count+1;
end

4 NMF的应用

现在,就用NMF算法解文章最开始提出的问题。

首先介绍原始数据。我们能得到的最原始的数据其实并不是图1左侧所示的那张图,而是一个4096*64的矩阵,存储于一个.txt文件中。该矩阵按列存储图1左侧中所示的128个、64组数字:矩阵的每一列代表图中的一个数字组,图中每两个横向连接的数字构成一个正方形的数字组,每一个数字组的图像大小是64*64,计4096个像素。图中每个数字都是集合{1,2,3,4}中的某个元素,单形状不同、浓淡(像素值)各异。经过一些基本的处理,就可以将这个4096*64的矩阵转换为图1左侧所示的图像。

对这一问题的处理思路如下。以两个横向相邻的数字为1组,形成8*8共计64张子图,将这64张子图,或者说是64个4096维向量映射到由8个新基底构成的坐标系上,这8个新基底向量仍在原数据所在的4096维实数空间中。

以上内容可由图5概括,如下所示。

图5 用NMF提取图像主要成分的过程分析

用NMF的方程表述,应当写成如下形式:

最后的结果如图6所示:

图6 用NMF提取图像主要成分的结果

下面分析图6的含义。

W是新产生的基底,有8个,每个仍然是4096维实数空间中的向量,在这里就体现为64*64的图像方块。在这个方块中,数字位于左右两侧,非左即右;且位于左侧和位于右侧的数字数量都是4,数字1,2,3,4各一,这很好地体现了基底之间线性不相关的性质。

以W为新基底,就可以将整张图投影到该基底上去。不妨按照顺序从上到下将新基底编号,那么原图64组数据都能在该基底上进行投影,相当于可以用一个8维向量,或者说是坐标,来表示原来的64*64子图,一定意义上也起到了数据压缩(有损压缩)的作用。

下面举例说明。第一张子图中的数字是42——42的左侧是数字4,左侧数字4在第5个位置,对应第5号基底;42的右侧是数字2,右侧数字2在第4个位置,对应第4号基底——因此,第一张子图对应的8位坐标中的第4个和第5个数字应当明显比其余6个数字大,图6中右侧的“变量-H”表中的第一列数据明显符合这一结论,红色矩形框圈出的两个最大的数字分别位于第4位和第5位。同理,第二张子图中的数字是11,对应新基底中的1号轴和3号轴,因此该子图在这两个轴上的投影最大,对应“变量-H”表中第二列数字中第1个和第3个数字最大。其余以此类推。

5 背景问题的拓展

经过上文的分析说明,读者应该对NMF有了基本的了解,并应当对它的物理意义有了更加深刻的体会。但是,我在把这个问题弄明白之后,又有了一点疑惑,就是为什么产生的新基底的数量要是8?或者说,为什么原图要拆分成64个子图、每个子图中有2个左右相邻的数字?我能不能将原图拆成128组、每组中只有1个数字?又或者我能不能将原图拆成32组、每组中有4个数字?甚至是16组、每组8个数字;8组、每组16个数字?等等。

为此,我又做了其他一些实验。结果表明,上述想法是可行的,在原理上也是正确的。下面我分别贴上将原图拆成128组、每组中只有1个数字和将原图拆成32组、每组中有4个数字这两组实验的结果,分别如图7和图8所示。这里不再对图7-8作仔细的分析。

图7 将原图拆成128组、每组中只有1个数字的NMF结果

图8 将原图拆成32组、每组中有4个数字的NMF结果

6 小结

在全文的最后,我将对这一系列的三篇文章,包括本篇和前两篇博客 学习笔记|主成分分析[PCA]及其若干应用学习笔记|独立成分分析(ICA, FastICA)及应用 进行一个小结。

PCA、ICA和NMF虽然格局特色,但是可以用一个关键词将它们联系起来:矩阵分解。从数学上来看,三者都可以用同一个公式表达:A=B*C,其中A、B、C都是矩阵。不同的是,在不同的算法中三个矩阵的已知和待求解的关系不同,对该公式的理解角度也不尽相同。下面用一张图简单描述上述三种方法的联系和区别,如图9所示。

图8 将原图拆成32组、每组中有4个数字的NMF结果

从这篇博客开始,代码不再通过百度网盘分享。欢迎到我的GitHub页面下载代码。(我的GitHub暂时还没整理好,敬请期待)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148927.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【机器学习】NMF(非负矩阵分解)
  本篇文章主要介绍NMF算法原理以及使用sklearn中的封装方法实现该算法,最重要的是理解要NMF矩阵分解的实际意义,将其运用到自己的数据分析中!
全栈程序员站长
2022/07/04
1.7K0
【机器学习】NMF(非负矩阵分解)
推荐算法——非负矩阵分解(NMF)
在博文推荐算法——基于矩阵分解的推荐算法中,提到了将用户-商品矩阵进行分解,从而实现对未打分项进行打分。矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积。对于上述的用户-商品矩阵(评分矩阵),记为Vm×nV_{m\times n},可以将其分解成两个或者多个矩阵的乘积,假设分解成两个矩阵Wm×kW_{m\times k}和Hk×nH_{k\times n},我们要使得矩阵Wm×kW_{m\times k}和Hk×nH_{k\times n}的乘积能够还原原始的矩阵Vm×nV_{m\times n}:
felixzhao
2019/02/13
1.5K0
推荐算法——非负矩阵分解(NMF)
一、矩阵分解回顾 image.png 二、非负矩阵分解 2.1、非负矩阵分解的形式化定义 image.png 2.2、损失函数 image.png 2.3、优化问题的求解 image.png imag
felixzhao
2018/03/20
1.8K0
推荐算法——非负矩阵分解(NMF)
NMF(非负矩阵分解)算法
NMF,非负矩阵分解,它的目标很明确,就是将大矩阵分解成两个小矩阵,使得这两个小矩阵相乘后能够还原到大矩阵。而非负表示分解的矩阵都不包含负值。
AIHGF
2019/02/18
2.5K0
文本主题模型之非负矩阵分解(NMF)
    在文本主题模型之潜在语义索引(LSI)中,我们讲到LSI主题模型使用了奇异值分解,面临着高维度计算量太大的问题。这里我们就介绍另一种基于矩阵分解的主题模型:非负矩阵分解(NMF),它同样使用了矩阵分解,但是计算量和处理速度则比LSI快,它是怎么做到的呢?
刘建平Pinard
2018/08/07
2.1K0
文本主题模型之非负矩阵分解(NMF)
非负矩阵分解NMF
non-negative matrix factorization,简写为NMF, 翻译为非负矩阵分解,属于矩阵分解的一种算法。在特征分解,SVD等传统的矩阵分解技术中,分解后的矩阵会出现负值,但是负值在实际场景中是没有意义的,比如在图像处理领域,图像是由像素点构成的矩阵,每个像素点由红,绿,蓝的比例构成,这些数值都是非负数,在对分解处理得到的负值并没有实际意义。
生信修炼手册
2021/04/14
1.2K0
RNAseq|组学分型-ConsensusClusterPlus(一致性聚类), NMF(非负矩阵分解)
肿瘤分型分析是生信文章中的常客,大致是通过将基因的表达量进行聚类或者非负矩阵分解,发现新的亚型,然后对不同亚型的临床特征,免疫特征等进行比较分析,文章末尾简单的列了一些应用。
生信补给站
2023/08/25
5.5K2
RNAseq|组学分型-ConsensusClusterPlus(一致性聚类), NMF(非负矩阵分解)
转录组非负矩阵分解(NMF)/一致性聚类(ConsensusClusterPlus)
非负矩阵分解(NMF)和一致性聚类(ConsensusClusterPlus)是两种常用的聚类和模式识别方法,它们在算法原理、使用场景和结果解读上都有相似和不同之处。这两种代码流程已经被诸多老师所解析和展示,本次也是跟着老师们发布在网上的流程进行练习和整理。
凑齐六个字吧
2024/08/13
6040
转录组非负矩阵分解(NMF)/一致性聚类(ConsensusClusterPlus)
单细胞非负矩阵分解分析python版(cNMF)学习
前置一个推文,老师的推文已经详细讲解了非负矩阵分解的算法原理~ 如果对算法原理感兴趣的可以点击以下链接~
凑齐六个字吧
2024/09/15
3250
单细胞非负矩阵分解分析python版(cNMF)学习
生信算法 | 矩阵分解除了NMF,也可以试试这个 NatGenet 新发的 GBCD 算法
生信菜鸟团
2025/02/03
1240
生信算法 | 矩阵分解除了NMF,也可以试试这个 NatGenet 新发的 GBCD 算法
基于R语言利用NMF(非负矩阵分解)替代层次聚类进行肿瘤分型
随着芯片和测序水平的发展,使得我们研究所有基因在整个基因组里的表达情况成为了可能。合理地利用和解释这些数据,能够帮助我们探索相关的生物过程和人类疾病的机制。目前已经有一些软件或方法,可以将具有相似表达模式的基因或者样本进行聚类,但是都有自身的限制。NMF包基于非负矩阵分解(non-negative matrix factorization,以下简称NMF)方法,提取基因表达矩阵内数据的生物相关系数,通过对基因和样本进行组织,抓住数据的内部结构特征,从而对样本进行分组,目前在疾病分型方面受到广泛应用。我前面已经介绍过了NMF的基本原理【NMF(非负矩阵分解)的算法原理】,这里我介绍R语言实现NMF。下面是一篇今年刚发的一篇纯生信的分析文章,用的就是NMF这个方法来对肿瘤进行分型。影响因子为4.8。
DoubleHelix
2022/01/19
19.3K0
基于R语言利用NMF(非负矩阵分解)替代层次聚类进行肿瘤分型
如何使用矩阵分解提升推荐效果
推荐系统在现代互联网应用中扮演着至关重要的角色,无论是电商平台的商品推荐,还是流媒体平台的视频推荐,都离不开高效的推荐算法。矩阵分解技术,作为推荐系统中的一种经典方法,因其优越的性能而被广泛应用。矩阵分解技术的核心思想是将用户-物品交互矩阵分解为低维矩阵,以此来挖掘用户和物品的潜在特征,从而提升推荐效果。
数字扫地僧
2024/08/08
1190
【Scikit-Learn 中文文档】分解成分中的信号(矩阵分解问题) - 无监督学习 - 用户指南 | ApacheCN
2.5. 分解成分中的信号(矩阵分解问题) 2.5.1. 主成分分析(PCA) 2.5.1.1. 准确的PCA和概率解释(Exact PCA and probabilistic interpretation) PCA 用于对一组连续正交分量中的多变量数据集进行方差最大方向的分解。 在 scikit-learn 中, PCA 被实现为一个变换对象, 通过 fit 方法可以降维成 n 个成分, 并且可以将新的数据投影(project, 亦可理解为分解)到这些成分中。 可选参数 whiten=Tr
片刻
2018/01/15
1.2K0
【Scikit-Learn 中文文档】分解成分中的信号(矩阵分解问题) - 无监督学习 - 用户指南 | ApacheCN
R语言实现非负矩阵分析
著名的科学杂志《Nature》于1999年刊登了两位科学家D.D.Lee和H.S.Seung对数学中非负矩阵研究的突出成果。该文提出了一种新的矩阵分解思想――非负矩阵分解(Non-negative Matrix Factorization,NMF)算法,即NMF是在矩阵中所有元素均为非负数约束条件之下的矩阵分解方法。
一粒沙
2019/07/31
6.5K3
R语言实现非负矩阵分析
基于非负矩阵分解的单细胞降维聚类分群
可以看到,在CD4和CD8的T细胞的各自矩阵内部降维聚类分群,这6个细分亚群都并不是泾渭分明的界限。听完分享才知道,原来作者这个时候的细分亚群其实并不关心它们内部是不是有不同的独立的单细胞亚群,仅仅是有这6个不同状态或者说发挥不同功能单细胞亚群。而区分它们的手段是非负矩阵分解,并不需要有很清晰的界限,只需要各个亚群的核心功能基因集有差异即可。
生信技能树
2022/03/03
3K0
基于非负矩阵分解的单细胞降维聚类分群
单细胞分析十八般武艺:NMF
非负矩阵分解(Non-negative Matrix Factorization, NMF)本质上说是一种矩阵分解的方法,对于任意给定的一个非负矩阵V,NMF算法能够寻找到一个非负矩阵W和一个非负矩阵H,使得 V≈W*H成立 ,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。
生信技能树jimmy
2021/03/25
12.8K0
单细胞分析十八般武艺:NMF
推荐系统之矩阵分解(MF)及其python实现
        目前推荐系统中用的最多的就是矩阵分解方法,在Netflix Prize推荐系统大赛中取得突出效果。以用户-项目评分矩阵为例,矩阵分解就是预测出评分矩阵中的缺失值,然后根据预测值以某种方式向用户推荐。今天以“用户-项目评分矩阵R(M×N)”说明矩阵分解方式的原理以及python实现。
Flaneur
2020/03/25
2.6K0
NMF-matlab
  这个算法是Lee和Seung在1999年发表在nature杂志上的。具体论文看这里:http://www.seas.upenn.edu/~ddlee/Papers/nmf.pdf。
全栈程序员站长
2022/07/02
2940
NMF-matlab
一种用于可分离的非负矩阵分解的量子启发经典算法
作者:Zhihuai Chen,Yinan Li,Xiaoming Sun,Pei Yuan,Jialin Zhang
罗大琦
2019/07/18
8620
MADlib——基于SQL的数据挖掘解决方案(6)——数据转换之矩阵分解
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/78971328
用户1148526
2019/05/25
8420
推荐阅读
相关推荐
【机器学习】NMF(非负矩阵分解)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文