非负矩阵分解 |
您所在的位置:网站首页 › python张量分解 › 非负矩阵分解 |
本文非负矩阵分解(Nonegative matrix factorization,NMF)系列第二篇,主要介绍最基本的NMF原理及代码实现,内容主要包括: 1)基于Euclidean距离的NMF推导及实现; 2)基于KL散度的NMF推导及实现; 3)NMF应用示例 开始之前,有两点需要补充: 前面分析用的是X=AS形式,感觉别扭,好多文章都是用V = WH,后续打算也采用这也表达方式;NMF其实是含有约束的优化问题,但乘法算法可以巧妙得让我们只需讨论:无约束优化问题。 一、基于Euclidean距离的NMF推导及实现考虑无约束优化问题: 利用梯度下降: 其中: 如果直接梯度下降,对于无约束的优化问题,我们不能保证结果都是非负的,下面巧妙之处来了:将梯度下降法变为乘法算法。 令: 梯度下降法变换为乘法算法: 真是巧妙!一个复杂的约束性优化问题,就让一个简单的无约束给解决了。这样一来,如果原矩阵为非负,W、H初始值同样非负,结果自始至终都是非负,直至迭代到满足收敛条件。 给出对应的代码实现: function [W, H] = nmf(V, K, MAXITER) %Euclidean distance F = size(V,1); T = size(V,2); rand('seed',0) W = 1+rand(F, K); % W = W./repmat(sum(W),F,1); H = 1+rand(K, T); ONES = ones(F,T); for i=1:MAXITER H = H .* (W'*V)./(W'*W*H+eps) ; W = W .* (V*H')./(W*H*H'+eps); end其实关键的就是循环里的两行。 二、基于KL散度的NMF推导及实现
整个思路与Euclidean distance下的求解思路如出一辙。 考虑无约束优化问题: 利用梯度下降算法: 其中: 根据梯度下降算法转化为乘法算法: 令: 梯度下降算法改写为乘法算法: 对应代码: function [W, H] = nmf(V, K, MAXITER) %KL-divergence F = size(V,1); T = size(V,2); rand('seed',0) W = 1+rand(F, K); % W = W./repmat(sum(W),F,1); H = 1+rand(K, T); ONES = ones(F,T); for i=1:MAXITER H = H .* (W'*( V./(W*H+eps))) ./ (W'*ONES); W = W .* ((V./(W*H+eps))*H') ./(ONES*H'); end
链接:http://www.cnblogs.com/xingshansi/p/6670214.html
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |