Non-negative Matrix Factorization 非负矩阵分解
著名的科学杂志《Nature》于1999年刊登了两位科学家D.D.Lee和H.S.Seung对数学中非负矩阵研究的突出成果。该文提出了一种新的矩阵分解思想――非负矩阵分解(Non-negative Matrix Factorization,NMF)算法,即NMF是在矩阵中所有元素均为非负数约束条件之下的矩阵分解方法。该论文的发表迅速引起了各个领域中的科学研究人员的重视:一方面,科学研究中的很多大规模数据的分析方法需要通过矩阵形式进行有效处理,而NMF思想则为人类处理大规模数据提供了一种新的途径;另一方面,NMF分解算法相较于传统的一些算法而言,具有实现上的简便性、分解形式和分解结果上的可解释性,以及占用存储空间少等诸多优点。
信息时代使得人类面临分析或处理各种大规模数据信息的要求,如卫星传回的大量图像、机器人接受到的实时视频流、数据库中的大规模文本、Web上的海量信息等。处理这类信息时,矩阵是人们最常用的数学表达方式,比如一幅图像就恰好与一个矩阵对应,矩阵中的每个位置存放着图像中一个像素的空间位置和色彩信息。由于实际问题中这样的矩阵很庞大,其中存放的信息分布往往不均匀,因此直接处理这样的矩阵效率低下,这对很多实际问题而言就失去了实用意义。为高效处理这些通过矩阵存放的数据,一个关键的必要步骤便是对矩阵进行分解操作。通过矩阵分解,一方面将描述问题的矩阵的维数进行削减,另一方面也可以对大量的数据进行压缩和概括。
在科学文献中,讨论利用矩阵分解来解决实际问题的分析方法很多,如PCA(主成分分析)、ICA(独立成分分析)、SVD(奇异值分解)、VQ(矢量量化)等。在所有这些方法中,原始的大矩阵V被近似分解为低秩的V=WH形式。这些方法的共同特点是,因子W和H中的元素可为正或负,即使输入的初始矩阵元素是全正的,传统的秩削减算法也不能保证原始数据的非负性。在数学上,从计算的观点看,分解结果中存在负值是正确的,但负值元素在实际问题中往往是没有意义的。例如图像数据中不可能有负值的像素点;在文档统计中,负值也是无法解释的。因此,探索矩阵的非负分解方法一直是很有意义的研究问题,正是如此,Lee和Seung两位科学家的NMF方法才得到人们的如此关注。
NMF是一种新的矩阵分解算法,它克服了传统矩阵分解的很多问题,通过寻找上下文有意义的解决方法,提供解释数据的更深看法。NMF通过寻找低秩,非负分解那些都为非负值的矩阵。这在现实的应用中有很多例子,如数字图像中的像素一般为非负数,文本分析中的单词统计也总是非负数,股票价格也总是正数等等。NMF的基本思想可以简单描述为:对于任意给定的一个非负矩阵A,NMF算法能够寻找到一个非负矩阵U和一个非负矩阵V,使得满足,从而将一个非负的矩阵分解为左右两个非负矩阵的乘积。由于分解前后的矩阵中仅包含非负的元素,因此,原矩阵A中的一列向量可以解释为对左矩阵U中所有列向量(称为基向量)的加权和,而权重系数为右矩阵V中对应列向量中的元素。这种基于基向量组合的表示形式具有很直观的语义解释,它反映了人类思维中“局部构成整体”的概念。研究指出,非负矩阵分解是个NP问题,可以划为优化问题用迭代方法交替求解U和V。NMF算法提供了基于简单迭代的求解U,V的方法,求解方法具有收敛速度快、左右非负矩阵存储空间小的特点,它能将高维的数据矩阵降维处理,适合处理大规模数据。利用NMF进行文本、图像大规模数据的分析方法,较传统的处理算法速度更快、更便捷。NMF思想的提出迅速得到了很多人的重视,并有很多将这种思想应用到实际中成功解决具体实际问题的例子。
这里是分解的公式:
这里r是分解矩阵的秩,V是原矩阵的一个近似,W与H就是分解而成的两个矩阵。
下面是W和H的求法,是一个迭代算法,初始的W与H是随机的就行了:
非负矩阵的具体算法如下:
输入参数:X,R,MAXITER,其中X为被分解的矩阵,R为降阶后B的秩,MAXITER为迭代次数 输出参数:B,H 1):初始化矩阵B,H为非负数,同时对B的每一列数据归一化 2):for i=:MAXITER a:更新H矩阵一行元素:H(i,j)=H(i,j)*(B'*X)(i,j)/(B'*B*H)(i,j) b:更新B的一列元素:B(k,j)=B(k,j)*(X*H')(k,j)/(B*H*H')(k,j); c:重新对B进行列归一化 )end
下面是代码:
clear all;
close all;
clc; V=double(imread('lena.jpg'));
imshow(mat2gray(V)); [i u]=size(V); %计算V的规格
r=; %设置分解矩阵的秩
W=rand(i,r); %初始化WH,为非负数
H=rand(r,u);
maviter=; %最大迭代次数
for iter=:maviter
W=W.*((V./(W*H))*H'); %注意这里的三个公式和文中的是对应的
W=W./(ones(i,)*sum(W));
H=H.*(W'*(V./(W*H)));
end img_V=W*H;
figure;
imshow(mat2gray(img_V));
下面是原图和重构后的效果,如果秩和迭代次数越大,那么重构后的图越接近原图:
原图
重构图
这个算法是Lee和Seung在1999年发表在nature杂志上的。具体论文看这里:http://www.cs.rutgers.edu/~mlittman/topics/dimred02/seung-nonneg-matrix.pdf
看不懂英文没关系,可以看这个中文的介绍:http://wenku.baidu.com/view/94c8af0bf78a6529647d5331.html。
文章结合自:http://fxy1211.blog.163.com/blog/static/68255322007826111015905/ 和 http://www.cnblogs.com/tiandsp/archive/2012/11/13/2768597.html
Non-negative Matrix Factorization 非负矩阵分解的更多相关文章
- 非负矩阵分解NMF
http://blog.csdn.net/pipisorry/article/details/52098864 非负矩阵分解(NMF,Non-negative matrix factorization ...
- Matrix Factorization SVD 矩阵分解
Today we have learned the Matrix Factorization, and I want to record my study notes. Some kownledge ...
- 【RS】Sparse Probabilistic Matrix Factorization by Laplace Distribution for Collaborative Filtering - 基于拉普拉斯分布的稀疏概率矩阵分解协同过滤
[论文标题]Sparse Probabilistic Matrix Factorization by Laplace Distribution for Collaborative Filtering ...
- 【RS】List-wise learning to rank with matrix factorization for collaborative filtering - 结合列表启发排序和矩阵分解的协同过滤
[论文标题]List-wise learning to rank with matrix factorization for collaborative filtering (RecSys '10 ...
- 【RS】Matrix Factorization Techniques for Recommender Systems - 推荐系统的矩阵分解技术
[论文标题]Matrix Factorization Techniques for Recommender Systems(2009,Published by the IEEE Computer So ...
- [线性代数] 矩阵代数進階:矩阵分解 Matrix factorization
Matrix factorization 导语:承载上集的矩阵代数入门,今天来聊聊进阶版,矩阵分解.其他集数可在[线性代数]标籤文章找到.有空再弄目录什麽的. Matrix factorization ...
- 关于NMF(Non-negative Matrix Factorization )
著名的科学杂志<Nature>于1999年刊登了两位科学家D.D.Lee和H.S.Seung对数学中非负矩阵研究的突出成果.该文提出了一种新的矩阵分解思想――非负矩阵分解(Non-nega ...
- 浅谈隐语义模型和非负矩阵分解NMF
本文从基础介绍隐语义模型和NMF. 隐语义模型 ”隐语义模型“常常在推荐系统和文本分类中遇到,最初来源于IR领域的LSA(Latent Semantic Analysis),举两个case加快理解. ...
- 非负矩阵分解(1):准则函数及KL散度
作者:桂. 时间:2017-04-06 12:29:26 链接:http://www.cnblogs.com/xingshansi/p/6672908.html 声明:欢迎被转载,不过记得注明出处哦 ...
随机推荐
- bzoj4184
题解: 按时间分治线段树 然后线性基维护一下就好了 尝试了一下循环展开并没有什么效果 代码: #include <bits/stdc++.h> using namespace std; ; ...
- jenkins X实践系列(1) —— 背景知识
本文介绍jenkins X(以下简称jx)相关的背景技术. jenkins X 简介 Jenkins X 是一个高度集成化的CI/CD平台,基于Jenkins和Kubernetes实现,旨在解决微服务 ...
- python单例模式的实现
1 线程不安全的单例模式 # -*- coding:utf-8 -*- from __future__ import unicode_literals import functools def sin ...
- Codeforces Round #424 E. Cards Sorting
题目大意:给你一堆n张牌(数字可以相同),你只能从上面取牌,如果是当前牌堆里面最小的值则拿走, 否则放到底部,问你一共要操作多少次. 思路:讲不清楚,具体看代码.. #include<bits/ ...
- Python swapcase
swapcase 字符串大写转换为小写小写转换为大写. a = "woHaoshuai" a.swapcase() WOhAOSHUAI
- 【Java】 剑指offer(8) 用两个栈实现队列
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数append ...
- laravel 控制器使用MODEL
第一步:引入MODEL类 use App\Http\Models\Sysdba; 第二步:使用 $uid = $request->input('uid'); 方法1. $model = new ...
- POJ 2407 Relatives【欧拉函数】
<题目链接> 题目大意: Given n, a positive integer, how many positive integers less than n are relativel ...
- Linux学习之常用网络通信命令与shell简单应用技巧(四)
(一)常用网络通信命令 (1)ping命令 (2)write命令 (3)wall命令 (4)ifconfig命令 (5)shutdown命令 (6)reboot命令 (二)shell简单应用技巧 (1 ...
- Effective Java 第三版——57. 最小化局部变量的作用域
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...