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

article/2025/9/21 14:28:07

原理啥的到处都有,就直接跳过了。这里主要是NMF的基础实验。下一篇是NMF的高光谱实验总结。


1. matlab示例解说

这一节的图片来自官方文档。
官方文档

这里第一和第三变量在第一行的值0.6945和0.62220对W的第一列有相当强的权重。第一个第二变量在第二行的值0.8020和0.5683对W的第二列有相当大的权重。

官方文档2

其中,H的转置是4乘2大小的。也就是有4个变量【SW,SL,PL,PW】,2个特征【所以是二维坐标轴X和Y轴】,转化到二维图上。使用W当做’scores’做出散点图。然后标签是这四个。


2. NMF代码与Lenna图

这个函数是拷别人的,来自这里。

function [W,H,errs,loss] = nmf_euc(V, r)
% 输入检查
% 不含负值元素
% H为系数矩阵,一列不能全为0if min(min(V)) < 0error('Matrix entries can not be negative');
end
if min(sum(V,2)) == 0error('Not all entries in a row can be zero');
end% V是一个含有n个样本的矩阵,每一列对应一个样本,每个样本为m维
[m,n] = size(V);% 随机初始化W和H矩阵
W = rand(m,r);
H = rand(r,n);% 设置最大迭代次数,保证分解结果是收敛的
niter = 10000;myeps = 1e-10;errs = zeros(niter,1);for t = 1:niterW = W .* ( (V*H') ./ max(W*(H*H'), myeps) ); 
%   W = normalize_W(W,1);H = H .* ( (W'*V) ./ max((W'*W)*H, myeps) );loss = sum((V-W*H).^2);errs(t) = sum(sum(loss));
end

这一段是调用该函数与matlab自带的nnmf函数进行的实验。文件lenna图在后面,是一个彩图,真实大小是 512 × 512 × 3 512\times 512\times 3 512×512×3。所以使用了reshape函数。我知道lena是拼错的该是lenna,但懒得改。

clear 
clcV=double(imread('lena.jpg'));
imshow(mat2gray(V));V = reshape(V,512,1536);
[W,H] = nnmf(V,50);
img_V=W*H;
img_V = reshape(img_V,512,512,3);
figure;
imshow(mat2gray(img_V));V = reshape(V,512,1536);
[W,H,errs,loss] = nmf_euc(V, 100);img_V=W*H;
img_V = reshape(img_V,512,512,3);
figure;
imshow(mat2gray(img_V));

分解出来W大小是 512 × 50 512\times 50 512×50,H是 50 × 1536 50\times 1536 50×1536大小。分解之后再乘回去即可复原。可以发现matlab自带的nnmf函数复原结果不好。使用的Lenna图如下,直接保存就可以用了:

在这里插入图片描述
nnmf分解再复原
在这里插入图片描述
对不起,Lenna女士。然后是nmf_euc分解再复原的。这图边界那么大是因为我直接保存图片然后复制过来的,其实该复制图窗再处理,但是懒orz
在这里插入图片描述

可以发现比官方的要好很多。

3. NMF与人脸识别

使用的数据集来自这里的Yale database 32乘32的data file。使用下面的代码打乱顺序并储存

leng = size(gnd,1);
lis = randperm(leng);
gnd = gnd(lis,:);
fea = fea(lis,:);
save('yaleFace.mat','gnd','fea');

此后,对数据进行NMF分解

clear
clcload('yaleFace.mat')
fea = fea';
readFace = reshape(fea,32,32,165);
for i = 1:165imshow(readFace(:,:,i)./255)
endrng(1) % For reproducibility
k = 16;
[W,H] = nnmf(fea,k);
C = reshape(W,32,32,k);
for i = 1:kimshow(C(:,:,i)./255)
end

在这里对fea转置,所以实际上fea是1024乘165的。 1024 = 32 × 32 1024=32\times 32 1024=32×32,是维度。而165是样本数。在随机数种子rng(1)之前可以把原图给过一遍。此后,降维到k=16,那么W是 1024 × 16 1024\times 16 1024×16大小的基矩阵,H是 16 × 165 16\times 165 16×165的系数矩阵。

好了重点来了。我代码这么写的思路是:基矩阵就是平均脸,一共16张平均脸。16就是[W,H] = nnmf(fea,k);的k值。之后reshape成 32 × 32 32\times 32 32×32的16张平均脸脸图。系数矩阵H就是把这些平均脸加权的。如果把NMF的基矩阵看做坐标轴的话,系数矩阵就是使用这些坐标轴标记出来的点。所以下一步该进行的分类聚类等算法处理的是系数矩阵H


4. 参考资料

最后,有两篇讲挺好的文档可供参考:

  • 文档1
  • 文档2

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

相关文章

【机器学习】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…

Web SSH 客户端工具

webssh简介 如何在浏览器web页面登录我们的linux机器&#xff0c;这个工具是使用Python开发 官网&#xff1a;https://pypi.org/project/webssh/ webssh这个工具可以干啥&#xff1f;&#xff1f; 在linux机器上安装python环境&#xff0c;并且使用命令pip3 install webssh,…

web版ssh工具

本系统后端使用springboot框架&#xff0c;持久层使用mybatis&#xff0c;jsch实现ssh,sftp连接&#xff0c;前端使用xterm.js,vue&#xff0c;elementplus框架&#xff0c;使用vue3-sfc-loader加载vue文件&#xff0c;无需使用npm包管理器 系统登录 系统注册 登录后主机资源树…

SSH服务详解(七)– SSH 连接 Github

SSH 连接 Github SSH服务详解(一)–Linux SSH 服务器与客户端的安装与启动 SSH服务详解(二)–使用私钥登录 SSH 服务器(免密登录) SSH 服务详解 (三)-- 使用 SSH 代理 SSH 服务详解 (四)-- 本地调用远程主机的命令 SSH 服务详解 (五)-- 远程文件拷贝 SSH 服务详解 (六)--…

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

最近由于项目需求&#xff0c;项目中需要实现一个WebSSH连接终端的功能&#xff0c;由于自己第一次做这类型功能&#xff0c;所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用&#xff0c;当时看到了很多这方面的项目&#xff0c;例如&#xff1a;GateOne、webssh、she…