• 大小: 2KB
    文件类型: .m
    金币: 2
    下载: 1 次
    发布日期: 2021-05-23
  • 语言: Matlab
  • 标签: Semi-NMF  matlab  

资源简介

半非负矩阵分解算法(Semi-NMF)的源代码,算法特别简练。

资源截图

代码片段和文件信息

function [Z H dnorm] = seminmf( X k varargin )
% Matrix sizes
% X: m x n
% Z: m x num_of_components
% H: num_of_components x num_of_components

% Process optional arguments
pnames = {‘z0‘ ‘h0‘ ‘bUpdateH‘ ‘maxiter‘ ‘TolFun‘ ‘bUpdateZ‘ ‘verbose‘ ‘save‘ ‘fast‘};

h0 = rand(k size(X 2)); 

dflts  = {0 h0 1 500  1e-5 1 1 0 0};

[Z H bUpdateH max_iter tolfun bUpdateZ verbose doSave fastapprox] = ...
        internal.stats.parseArgs(pnamesdfltsvarargin{:});

if fastapprox
    H = LPinitSemiNMF(X k); 
end

key = generate_checksum(X k);

if ispc
    path = [‘\\fs-vol-hci2.doc.ic.ac.uk\hci2\projects\trigeorgis\nmf\seminmf_cache\‘ key ‘.mat‘];
else
    path = [‘/vol/hci2/projects/trigeorgis/NMF/seminmf_cache/‘ key ‘.mat‘];
end

if  doSave && exist(path ‘file‘) ~= 0
    load(path);
    return;
end

if length(Z) == 1
    Z = X * pinv(H);
end

dnorm = norm(X - Z * H ‘fro‘);

for i = 1:max_iter
    
    if bUpdateZ
        try
            Z = X * pinv(H);
        catch
            display(‘Error inverting‘);
        end
    end
    
    A = Z‘ * X;
    Ap = (abs(A)+A)./2;
    An

评论

共有 条评论