非负矩阵分解NMF简介

article/2025/9/21 14:18:15

本文整理NMF相关知识。

简介

非负矩阵分解(Nonnegative Matrix Factorization),简称NMF,是由Lee和Seung于1999年在自然杂志上提出的一种矩阵分解方法,它使分解后的所有分量均为非负值(要求纯加性的描述),并且同时实现非线性的维数约减。NMF已逐渐成为信号处理、生物医学工程、模式识别、计算机视觉和图像工程等研究领域中最受欢迎的多维数据处理工具之一。

如果X是一个nxp非负矩阵,NMF就是找到两个矩阵W和H,使得

85d55a94ad9df1e6ba0a9e2b0bdca6e7.png

W、H是n×r和r×p的非负矩阵。在实践中,因式分解的rank(级别)通常被选择为r<<min(n, p),其目的是为了将X中包含的信息分成r个因子,也就是W的列。不同领域中矩阵W的名称不同,比如基础图像,元基因,源信号等,而矩阵H可能会称为混合系数矩阵和元基因表达系数等。

算法

可以通过普通的梯度下降法(SGD),或根据Lee和Seung文章提出的multiplicative update的规则进行计算获取矩阵W和H。

参见: https://zhuanlan.zhihu.com/p/116846017

6f906572d0683266ee4037b29f68cba3.png

除此之外,R的NMF包内置的算法就有11种之多,(综述Berry2007; Chu2004)。其中默认是brunet,可使用nmfAlgorithm()设定算法。

eda5acfef0d3239b3ea00296164b1cf3.png

aa2d3ffdd3f09122963e9d7ea6aeffc8.png

大部分算法由C++执行,也可以选用R执行的版本。

4b4f2b1ca90c5c3648ec1de41b0fb00b.png

并且可以将算法做成list,对比各种算法的表现。

nmf.res.multi.method <- nmf(nmf.input, rank2use,list('brunet', 'lee', 'ns'), seed=seed2use)
compare(nmf.res.multi.method)

除了内置的算法,NMF包还允许接入其他NMF算法,例如projective NMF(PNMF)

bc7581d0c552e6f62f22deeea3be1b11.png

remotes::install_github("richardbeare/pNMF")
library(NMF)
setNMFMethod("PNMF", pNMF::PNMF)

与NMF相比,PNMF算法将H进一步分解,生成一个更稀疏的矩阵,有利于特征提取和聚类(Ball et al HBM2017)。

模型表现

问题一:如何选择rank数目?

相关指标的解释,来自于NMF相关函数说明。

413ab16f16de4fd112d36a4108f1c80a.png

👉Cophenetic correlation

The cophenetic correlation coeffificient is based on the consensus matrix (i.e. the average of connectivity matrices) and was proposed by Brunet et al. (2004) to measure the stability of the clusters obtained from NMF. It is defined as the Pearson correlation between the samples' distances induced by the consensus matrix (seen as a similarity matrix) and their cophenetic distances from a hierachical clustering based on these very distances (by default an average linkage is used). See Brunet et al. (2004).

👉Dispersion coefficent

The dispersion coefficient is based on the consensus matrix (i.e. the average of connectivity matrices) and was proposed by Kim et al. (2007) to measure the reproducibility of the clusters obtained from NMF.

👉evar/residual/rss

Explained variance/residual/residual sum of sqaures

In the context of NMF, Hutchins et al. (2008) used the variation of the RSS in combination with the algorithm from Lee et al. (1999) to estimate the correct number of basis vectors. The optimal rank is chosen where the graph of the RSS first shows an inflexion point, i.e. using a screeplot-type criterium. 

Note that this way of estimation may not be suitable for all models. Indeed, if the NMF optimisation problem is not based on the Frobenius norm, the RSS is not directly linked to the quality of approximation of the NMF model. However, it is often the case that it still decreases with the rank.

👉Silhouette

Silhouette refers to a method of interpretation and validation of consistency within clusters of data. The technique provides a succinct graphical representation of how well each object has been classified. It was proposed by Belgian statistician Peter Rousseeuw in 1987.

The silhouette value is a measure of how similar an object is to its own cluster (cohesion) compared to other clusters (separation). The silhouette ranges from −1 to +1, where a high value indicates that the object is well matched to its own cluster and poorly matched to neighboring clusters. If most objects have a high value, then the clustering configuration is appropriate. If many points have a low or negative value, then the clustering configuration may have too many or too few clusters.

The silhouette can be calculated with any distance metric, such as the Euclidean distance or the Manhattan distance.

94d60680e45d1a86561d0b748a921c71.png

👉Sparseness

The sparseness quantifies how much energy of a vector is packed into only few components (Hoyer; 2004). The sparseness is a real number in [0,1]. It is equal to 1 if and only if X contains a single nonzero component, and is equal to 0 if and only if all components of X are equal. It interpolates smoothly between these two extreme values. The closer to 1 is the sparseness the sparser is the vector.

关于选择rank数目的建议,例如,Brunet(2004)建议选择cophenetic开始下降的第一个r值,Hutchins(2008)建议选择RSS曲线出现切点的第一个值。Frigyesi(2008)认为RSS的下降幅度低于从随机数据得到的RSS的下降幅度的最小值,NMF自带了randomize函数可以对每一列进行重采样。另外也可以结合多个指标选择rank数量,例如下图是2021年看到的poster,选择了r=8,此时error小stability高。为什么不选r=10,12,28?需要考虑可解释性和过拟合的问题。

fc7d758fc0ac45c682e232dfb85a9982.png

也看到过根据假设或者说故事合不合理来决定,比如做MCI发现一个亚类型更像HC,一个亚类型更像AD,碎石图都不需要了,直接决定r=2e08929efb3c612d233e2fe41a076ec90.png

5720acc6f494f3966bd4ecfb4975be65.png

【传送门】

问题二:应该使用多少个run?

一个run代表做一次NMF分解,每一次得到的结果都可能有出入,因此需要多个run。文献(Brunet2004; Hutchins2008)推荐run的数量是30-50,NMF文档另外一个地方推荐的是100-200。结果fit变量中默认保存的是表现最好的一个run的H和W矩阵,如果需要保存所有run的结果,需要设定

.options=list(keep.all=TRUE)

作图

be97345250178ce869fba400b438b91f.png

nmf.res为运行结果。

plot(nmf.res)获取的是模型表现的各个指标

cf0076aeb13062003f9f231d44e87fa8.png

consensusmap(nmf.res)获取多个run之间的一致性。

701868c8ff5af99ad9331a6a9a0a53a5.png

basismap(nmf.res$fit$`3`, subsetRow=TRUE)

coefmap(nmf.res$fit$`3`)

可以绘制相应rank中矩阵W和H的热图

d857054d6b0cc585ef50b499dc2b9746.png

NMF和PCA的区别

abb313b4976f14d2991e0833df7a2e3f.png

都为矩阵分解的方法,约束条件不同,PCA要求分解后矩阵正交,NMF要求分解后矩阵都为正,NMF如果只要求一个矩阵为正,则是semi-NMF,增加L1正则项,则是spase NMF。其中semi-NMF的用处就是可以允许被分解矩阵X中存在负数,对应NMF包设置为mixed=TRUE,有此设置,可以跳过对输入数据的符号检查,使用自定义的semi-NMF算法进行因式分解。

b7d408026da01897188b52c747dc72bc.png

用NMF的一个目的就是得到sparse并且可加的分解结果,便于解释。其实Sparse PCA也有类似的效果,sparse的主轴只和某几个变量相关,提高了在实际使用中的可解释性。

a0a7aebe699eddc3d5ab4e7f97bc77bb.png

关于NMF在领域内的一些应用,见下一个推送。

93390e27c0877c5c4413c66fe9316482.png

dead0a81b22d379a41cdddfb64a72a79.png


http://chatgpt.dhexx.cn/article/jjRno6hN.shtml

相关文章

NMF

计算机是人类解决难题、探索未知以及提供娱乐的绝佳工具。在高效运行着的各种计算机应用背后&#xff0c;融汇了人类在物理、电子和数学等多门学科的高超智慧。严密的数学使得计算机能高效执行人类指令&#xff0c;控制内部各种数据流的走向&#xff0c;因此在现代计算机科学研…

无监督学习——非负矩阵分解(NMF)

序 非负矩阵分解&#xff08;NMF&#xff09;是一种无监督学习算法&#xff0c;其目的在于提取有用的特征。它的工作原理类似于PCA&#xff0c;也可以用于降维。与PCA相同&#xff0c;我们试图将每个数据点写成一些分量的加权求和。但在PCA中&#xff0c;我们想要的是正负分量…

非负矩阵分解NMF

http://blog.csdn.net/pipisorry/article/details/52098864 非负矩阵分解(NMF,Non-negative matrix factorization) NMF的发展及原理 著名的科学杂志《Nature》于1999年刊登了两位科学家D.D.Lee和H.S.Seung对数学中非负矩阵研究的突出成果。该文提出了一种新的矩阵分解思想—…

非负矩阵分解(NMF)的Matlab实例与说明

原理啥的到处都有&#xff0c;就直接跳过了。这里主要是NMF的基础实验。下一篇是NMF的高光谱实验总结。 1. matlab示例解说 这一节的图片来自官方文档。 这里第一和第三变量在第一行的值0.6945和0.62220对W的第一列有相当强的权重。第一个第二变量在第二行的值0.8020和0.568…

【机器学习】NMF(非负矩阵分解)

写在篇前 本篇文章主要介绍NMF算法原理以及使用sklearn中的封装方法实现该算法&#xff0c;最重要的是理解要NMF矩阵分解的实际意义&#xff0c;将其运用到自己的数据分析中&#xff01; 理论概述 NMF(Non-negative matrix factorization)&#xff0c;即对于任意给定的一个非负…

vs快捷键与vs自定义快捷键

文章目录 :star: 主题&#xff1a;VS快捷键1.常用的默认快捷键2.自定义快捷键2.1 添加快捷键2.2 移除快捷键2.3 重置快捷键&#xff0c;恢复默认 :bookmark: 小结 ⭐️ 主题&#xff1a;VS快捷键 &#x1f4cd; 来自&#xff1a;中南林业科技大学软件协会学术部&#xff1a;谢…

vs注释与反注释快捷键

使用VS C语言编译器的快捷注释按键&#xff1a; 选中部分注释&#xff1a; Ctrl KD &#xff08;按住Ctrl然后先按K再按D&#xff09; 注释前&#xff1a; 注释后&#xff1a; 反注释&#xff1a; Ctrl KU &#xff08;按住Ctrl然后先按K再按U&#xff09; 操作完就恢复了…

VS(visual studio)注释快捷键及自定义设置

注释&#xff1a; CtrlKC 取消注释&#xff1a; CtrlKU 【工具】→【选项】→【环境】→【键盘】→【搜索注释】 点击【编辑.注释选定内容】→【移除】 输入快捷键&#xff0c;点击【分配】→【确定】 取消注释的自定义快捷键同理设置即可&#xff0c;注释和取消注释不…

Visual Studio Code2022无法使用注释快捷键

用了一个月vscode&#xff0c;使用ctrl/发现注释始终无法使用&#xff0c;最开始一直以为是系统或者版本问题&#xff0c;因为之前机器做过一次修改机器码的操作。 今天尝试解决了一下&#xff0c;发现问题可以通过键盘映射方案进行解决 文件->账户设置或者右上角头像图标 搜…

vs2019注释快捷键设置

vs2019默认的注释快捷键为ctrl&#xff0b;k&#xff0b;c 取消注释快捷键为ctrl&#xff0b;k&#xff0b;u 我们也可以自己设置 当然&#xff0c;也可以设置自己习惯的快捷键

VS中的设置和快捷键

一.相关设置 1.设置主题颜色 【工具】-》【选项】-》【常规】&#xff0c;选择主题颜色为浅色&#xff0c;点击确定。 2.设置背景颜色 【工具】-》【选项】-》【字体和颜色】&#xff0c;项背景颜色那里&#xff0c;点击自定义。 HSB&#xff08;HSL&#xff09;&#xff1a…

VS注释快捷键整理

在 Visual Studio IDE 中使用快捷键注释代码&#xff0c;无论是行注释还是块注释&#xff0c;第一步一定是选中要注释的内容&#xff08;取消注释同样要先选中&#xff09;&#xff01; 当然&#xff0c;如果是行注释&#xff0c;不必选取整行&#xff0c;将光标定位到该行即可…

javassh客户端_简单的Java SSH客户端

javassh客户端 可以使用jcabi-ssh在Java中通过几行代码通过SSH执行shell命令: String hello = new Shell.Plain(new SSH("ssh.example.com", 22,"yegor", "-----BEGIN RSA PRIVATE KEY-----...") ).exec("echo Hello, world!"); jca…

Java打造一款SSH客户端,而且已开源

点击上方“Java基基”&#xff0c;选择“设为星标” 做积极的人&#xff0c;而不是积极废人&#xff01; 源码精品专栏 原创 | Java 2020 超神之路&#xff0c;很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数…

最新版本spring框架下载

首先spring的各种好就不说了&#xff1b;主要是最近spring将官网地址www.springsource.org改为了http://spring.io/&#xff08;新网站设计的比较舒服&#xff0c;这难道是奔商业化的节奏去的吗&#xff1f;&#xff01;&#xff09;&#xff1b;同时spring将原来比较容易找到的…

用 Java 打造一款 SSH 客户端,这个太强了。。

前言 最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:GateOne、webssh、shellinabox等。 这些项目都可以很好地实现webssh的功能,但…

Java 打造一款 SSH 客户端,已开源~

来源&#xff1a;https://blog.csdn.net/NoCortY/article/details/104772431 前言 最近由于项目需求&#xff0c;项目中需要实现一个WebSSH连接终端的功能&#xff0c;由于自己第一次做这类型功能&#xff0c;所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用&#x…

官网下载最新版本Spring

目录 官网下载步骤官网下载地址 官网下载步骤 官网地址&#xff1a;https://spring.io/projects/spring-framework 1.点击右上角 Git 图标 2. 进入Spring的Git仓库 3. 进入Spring Framework Artifacts后点击"https://repo.spring.io" 4.进入Spring repository&a…

SSH框架整合demo

Struts、Spring、Hibernate整合 一、创建web工程&#xff0c;搭建Struts框架开发环境&#xff1a; 这里只导入了项目中所需要的重要的jar包&#xff0c;以后根据业务要求继续导入相关的包。 步骤1&#xff1a;:导入struts框架所需的jar包步骤2&#xff1a;在web.xml中配置stru…

Spring的下载

Spring是一个独立的框架&#xff0c;他不需要依赖于任何Web服务器或容器&#xff0c;既可以在独立的javaSE项目中使用&#xff0c;也可以在JavaEE项目中使用&#xff0c;在使用Spring之前需要获取它的JAR包&#xff0c;下面就是Spring下载的详细过程。 1.使用浏览器访问Spring…