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


1. matlab示例解说

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

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

其中,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×3512\times 512\times 3512×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×50512\times 50512×50,H是50×153650\times 153650×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×321024=32\times 321024=32×32,是维度。而165是样本数。在随机数种子rng(1)之前可以把原图给过一遍。此后,降维到k=16,那么W是1024×161024\times 161024×16大小的基矩阵,H是16×16516\times 16516×165的系数矩阵。

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


4. 参考资料

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

  • 文档1
  • 文档2

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

  1. 文本主题模型之非负矩阵分解(NMF)

    1. 非负矩阵分解(NMF)概述 非负矩阵分解(non-negative matrix factorization,以下简称NMF)是一种非常常用的矩阵分解方法,它可以适用于很多领域,比如图像特征识别 ...

  2. 【机器学习】(十七)非负矩阵分解NMF:人脸图像特征提取、用特征排序;还原混合信号

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

  3. 非负矩阵分解NMF(1): 非调包python实现

    文章目录 1. 矩阵分解(Matrix Factorization): 1.1 公式推导 1.2 代码实现 1.3 在图像数据下的效果 2. 非负矩阵分解(Non-negative Matrix Fa ...

  4. 详解非负矩阵分解(NMF)及其在脑科学中的应用

    非负矩阵分解及其在脑科学中的应用 基本原理 确定最优因子数量 代码实现 非负矩阵分解与主成分分析的区别 非负矩阵分解在脑科学中的应用 应用一:神经发育模式:T2w/T1w比值映射的非负矩阵分解(NMF ...

  5. 推荐算法——非负矩阵分解(NMF)

    1. 矩阵分解回顾 在博文推荐算法--基于矩阵分解的推荐算法中,提到了将用户-商品矩阵进行分解,从而实现对未打分项进行打分.矩阵分解是指将一个矩阵分解成两个或者多个矩阵的乘积.对于上述的用户-商品矩阵 ...

  6. Non-Negative Matrix Factorization 非负矩阵分解(NMF)

    Non-Negative Matrix Factorization 非负矩阵分解(NMF) 简介及基本思想 1999年由D.D.Lee和H.S.Seung提出的新的矩阵分解思想,在矩阵中所有元素均为非 ...

  7. 机器学习笔记:非负矩阵分解问题 NMF

    1 NMF介绍 NMF(Non-negative matrix factorization),即对于任意给定的一个非负矩阵V,其能够寻找到一个非负矩阵W和一个非负矩阵H,满足条件V=W*H,从而将一个 ...

  8. python-非负矩阵分解-NMF

    非负矩阵分解 非负矩阵分解是矩阵中所有元素均为非负数约束条件下的矩阵分解,其基本思想:给定一个非负矩阵V,NMF能够找到一个非负矩阵W和一个非负矩阵H,使得矩阵W和矩阵H的乘积近似等于矩阵V中的值. ...

  9. 推荐系统笔记:基于非负矩阵分解的协同过滤

    1 非负矩阵分解 非负矩阵分解 (NMF) 可用于非负的评级矩阵. 这种方法的主要优势不一定是准确性,而是它在理解用户-项目交互方面提供的高度可解释性. 与其他形式的矩阵分解的主要区别在于因子 U 和 ...

  10. 大数据聚类分析用于预测_多模态数据中的非负矩阵分解用于分割和标签预测

    引用 Akata Z, Thurau C, Bauckhage C. Non-negative matrix factorization in multimodality data for segme ...

最新文章

  1. iis服务器文件上传速度慢,windows 2008 R2 上传速度慢
  2. Java虚拟机13:Java类加载机制
  3. 步骤详解安装Apache web服务器
  4. Objective-C objc_class 介绍
  5. php设计模式 -- 工厂模式
  6. spark项目实战:电商分析平台之各个范围Session步长、访问时长占比统计(需求一)
  7. leetcode 310. Minimum Height Trees | 310. 最小高度树(图的邻接矩阵DFS / 拓扑排序)
  8. c语言入门程序下载,简单实用——C语言入门程序练习
  9. 学习笔记02:直播串讲02
  10. Java代码服务器上下载图片_Java如何从服务器中下载图片
  11. Matlab--二次多项式曲面拟合
  12. operator* operator- 操作符的使用
  13. react diff算法剖析总结
  14. 谈谈Linux的栈回溯与妙用
  15. zoj 3284 Matrix Processing(二维树状数组)
  16. MFC (opencv配置) 应用程序无法正常启动(0xc000007b)请单击“确定关闭应用程序 的解决方法
  17. Tomcat自动生成会话JSESSIONID
  18. ImportError: cannot import name ‘PILLOW_VERSION‘ from ‘PIL‘ (/home/user8/anaconda3/envs/FCOS/lib/pyt
  19. AT指令对wavecom串口GSM工业手机发送短信(英文和PDU短信)
  20. 尚学堂-HTML-CSS(基础)的学习记录

热门文章

  1. 苹果12官网html代码免费版,苹果iOS 12代码曝光 Apple Watch 4
  2. matlab 半正定规划,半定规划算法(Semi-Definite Programming Algorithm).ppt
  3. 2021年度总结 - 工作四年半记
  4. [HITSC] 2021期末复习-第九章
  5. 一个教育行业程序员的无奈-非自愿辞职的起终
  6. 星志远电商:2022拼多多如何获得流量?
  7. 快商通李稀敏:近场声纹识别将普及,本地化的AI能力是刚需
  8. JSP活动报名管理系统
  9. 限制textarea文本域中输入字符个数(防粘贴)
  10. 原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (一)什么是单元测试