精华内容
下载资源
问答
  • 独立成分分析ICA、因子分析、LDA降维、NMF非负矩阵分解
    2021-06-05 10:42:51

    独立成分分析ICA、因子分析、LDA降维、NMF非负矩阵分解

    目录

    独立成分分析ICA、因子分析、LDA降维、NMF非负矩阵分解

    独立成分分析ICA

    更多相关内容
  • import matplotlib.pyplot as plt from sklearn import decomposition from sklearn.datasets import fetch_olivetti_faces from numpy.random import RandomState n_row, n_col = 2, 3 n_components = n_row * n_...
  • NMF非负矩阵分解

    2021-02-04 15:17:11
    NMF非负矩阵分解是将一个非负矩阵分解成两个非负矩阵,处理有些实际问题时数据往往是非负数,其他的矩阵分解如SVD分解有时会将矩阵分解成含有负数矩阵,负数出现与实际情况相悖。NMF在图像处理、推荐系统、数据降维...

    NMF非负矩阵分解是将一个非负矩阵分解成两个非负矩阵,处理有些实际问题时数据往往是非负数,其他的矩阵分解如SVD分解有时会将矩阵分解成含有负数矩阵,负数出现与实际情况相悖。NMF在图像处理、推荐系统、数据降维中有着广泛的应用,NMF在实现方法上也与其他矩阵分解有质的区别。

    一、理解NMF

       NMF将一个非负矩阵V分解成两个非负矩阵W、V,三者的关系是:

    V≈W*H

    注意中间是约等于的关系,NMF需要找出两个非负矩阵来近似原来的矩阵。不妨设V是m行n列的矩阵:V∈Rm*n,W是m行r列矩阵:W∈Rm*r,H是r行n列矩阵:H∈Rr*n。从几何角度看,V代表了一个n维线性空间,W代表了一个r维线性空间,由于r<n,所以W是V的子空间,H矩阵代表系数矩阵,也可以理解为坐标矩阵,所以也可以这样定义NMF:找到一个线性空间V的子空间W,使得空间V中的向量投影到子空间W中后误差最小,如下图:

    几何意义.png

    v1,v2,v3是V空间的向量,e1,e2,e3是v1,v2,v3投影到W子空间后的误差,满足所有误差最小子空间W即为目标矩阵,在NMF算法中W称为基矩阵,H称为系数矩阵。

        来看一个具体的例子,下面的程序根据10位受访者对10部影片打分,利用NMF可分别对用户和电影进行分类:

    import numpy as np
    from sklearn.decomposition import NMF
    from _collections import defaultdict
    import  matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif']=['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    if __name__=='__main__':
        ratings = [
            [5.0, 5.0, 4.5, 4.5, 5.0, 3.0, 2.0, 2.0, 0.0, 0.0],
            [4.2, 4.7, 5.0, 3.7, 3.5, 0.0, 2.7, 2.0, 1.9, 0.0],
            [2.5, 0.0, 3.3, 3.4, 2.2, 4.6, 4.0, 4.7, 4.2, 3.6],
            [3.8, 4.1, 4.6, 4.5, 4.7, 2.2, 3.5, 3.0, 2.2, 0.0],
            [2.1, 2.6, 0.0, 2.1, 0.0, 3.8, 4.8, 4.1, 4.3, 4.7],
            [4.7, 4.5, 0.0, 4.4, 4.1, 3.5, 3.1, 3.4, 3.1, 2.5],
            [2.8, 2.4, 2.1, 3.3, 3.4, 3.8, 4.4, 4.9, 4.0, 4.3],
            [4.5, 4.7, 4.7, 4.5, 4.9, 0.0, 2.9, 2.9, 2.5, 2.1],
            [0.0, 3.3, 2.9, 3.6, 3.1, 4.0, 4.2, 0.0, 4.5, 4.6],
            [4.1, 3.6, 3.7, 4.6, 4.0, 2.6, 1.9, 3.0, 3.6, 0.0],
        ]
        movie={
            1:'星球大战',
            2:'黑客帝国',
            3:'盗梦空间',
            4:'哈利波特',
            5:'霍比特人',
            6:'六壮士',
            7:'拯救大兵瑞恩',
            8: '兵临城下',
            9: '魔窟寻谍',
            10: '大逃亡'
        }
        A=np.asmatrix(ratings,dtype=np.float)
        max_components=2
        nmf=NMF(n_components=max_components, init='random', random_state=1)
        A_dash=nmf.fit_transform(A)
        F=nmf.components_
        xf,yf=F[0,:],F[1,:]
        for i in range(A_dash.shape[0]):
            print('用户id:%d 成分1得分:%0.2f 成分1得分:%0.2f'%(i+1,A_dash[i,0],A_dash[i,1]))
            print()
        print('='*50)
        for i in range(F.shape[1]):
            print('%s 成分1得分:%0.2f 成分1得分:%0.2f'%(movie[i+1],F[0,i] ,F[1,i] ))
            print()
        plt.figure(1)
        plt.title('基矩阵')
        x,y=A_dash[:,0],A_dash[:,1]
        plt.scatter(x,y)
        plt.xlabel('成分1得分')
        plt.ylabel('成分2得分')
        for i in range(A_dash.shape[0]):
            plt.annotate(i+1, (A_dash[i, 0], A_dash[i, 1]) )
        plt.figure(2)
        plt.title('系数矩阵')
        plt.scatter(xf, yf)
        plt.xlabel('成分1得分')
        plt.ylabel('成分2得分')
        for i in range(F.shape[1]):
            plt.annotate(movie[i+1],(F[0,i] ,F[1,i] ))
        plt.show()

    ratings变量代表受访者的打分信息,是一个10*10的非负矩阵,上述代码利用nmf将ratings分解成两个矩阵,一个是矩阵A_dash∈R10*2,A_dash对应NMF分解的基矩阵,打印A_dash有以下信息:

    w得分.png

    根据A_dash可以对用户进行分类,比如id=1的用户,根据打分的情况可以判断出他偏好成分2的电影,但不喜欢成分1的电影,再比如id=3的用户偏好成分1的电影,而成分1和成分2分别对应哪些题材电影呢?这可以通过系数矩阵收集到相应信息,系数矩阵对应代码中矩阵F,打印F矩阵信息如下:

    H得分.png

    可以看出星球大战成分2得分较多,id1和id2的用户都喜欢星球大战、黑客帝国、霍比特人这类电影,这当然不是偶然的,可以发现成分2得分较多的电影大都是科幻、魔幻类电影,而成分1得分较多的是战争题材电影。这样一来就通过NMF对受访者以及电影实现了分类,如下图:

    Figure_1.pngFigure_2.png

    还可以利用NMF开发推荐系统,比如一个用户没有对其中一个偏好成分1(战争题材电影)的电影打分,但通过用户对其他电影打分可以判断出该用户偏向于成分1的电影,那么就可以向其推荐战争题材的电影。

    二、NMF公式推导

    2.1、矩阵范数

        在分析向量、矩阵时,常常利用范数将向量、矩阵变为一个实数,变为实数后就可以利用多种手段如微分、积分、幂级数等手段做进一步处理。设有一个矩阵A∈Rm*n,矩阵A的任意一个元素用aij表示,常用矩阵范数形式有1-范数:

    范数一.gif

    Frobenius范数或称F-范数:

    f范数.gif

    范数几何意义是向量或矩阵的长度,当线性空间引入范数后也就有了距离的概念,这很好理解,比如两个向量v和u,v-u代表两者之间一个向量,而范数||v-u||就表示v和u之间向量长度,也就得到了v和u之间距离,所以线性赋范空间是一个距离空间。距离空间与熟识欧几里得空间还差一个角度的概念,角度需要在距离空间的基础上再引入内积。

        基矩阵W与系数矩阵H相乘后的矩阵用B表示,V-B表示分解后矩阵B与原矩阵V的误差,结合上面的分析,范数||V-B||较小时说明B与原矩阵有较好的相似性,NMF算法的目标可以描述为求下面F-范数平方的最小值:

    nmf范数.gif              

    设W是m行r列矩阵:W∈Rm*r,H是r行n列矩阵:H∈Rr*n,则bij可表示为:

    bij.gif                                            

    ②代入①式后可得下面的损失函数:

    nmf范数2.gif

    公式(3)中共有m*n个未知参数,可以通过梯度下降法求未知参数,上式中由于含有平方项,为后期处理方便通常把损失函数表示成下面的形式:

    范数2.png

    2.2 、最大似然法推导损失函数

        上面利用范数导出导出了损失函数(3.1)式,接下来利用最大似然法从另一个角度理解NMF算法,依然利用之前的假设:基矩阵W与系数矩阵H相乘后的矩阵用B表示,则V=B+E,E代表了V与B之间的误差,具体到矩阵每个元素可以这样表示:

    eij.gif

    假设eij为数学期望为0,方差为σ2的正态分布,即正态分布.gif,最大似然法即为求下面函数最大值:

    最大似然法.png

    由于方差σ大于0,所以求上式最大值实质为求最狭窄.gif最小值,这与用矩阵范数导出的损失函数是一致的,这个结论并不是偶然的,矩阵法本质是最小二乘法,而最小二乘法、线性回归都是将误差设定为正态分布。NMF在应用中根据实际情况,误差项也可以用其他概率分布实现,之前文章曾介绍过,最大似然法与求交叉熵最小值是本质一个问题,如果将泊松分布与熵模型结合可以得到NMF另一种损失函数形式-KL散度损失函数,形式如下:

    泊松分布.png

    本篇重点研究矩阵分解后误差为正态分布的情况,即NMF损失函数为公式(3.1),接下来对式(3.1)求导得到各个参数梯度。

    2.3、求损失函数最优解

        设wit为基矩阵W(W∈Rm*r,t≤r)任意一个元素,由链式法则有:

    链式法则.gif

    由公式②可得:

    htj.gif

    而当确定w的下标i和t后,观察可以发现:wit只与矩阵B=W*H的第i行向量有关,所以有:

    求导1.png

    这样得到未知参数wit的梯度为:

    wt梯度.gif    

    注意,④式中i和t是常量,j,k是迭代变量,通常④式写成下面矩阵相乘的形式:

    梯度1.gif        (4.1)

    同理,可以得到系数矩阵H任意一个元素htj的梯度:

    梯度2.gif       (4.2)

    求目标函数最小值,则需要按梯度反方向更新参数:

    推导公式.png

    上式中μit 、 ηtj称为步长系数,在神经网络中也成为学习率,可以发现NMF算法中每个未知参数的步长系数都是不同的,最重要的一点,NMF必须确保分解后矩阵是非负数,μit 、 ηtj取数是受到一定限制的,可以通过下面的换元法保证分解后矩阵的非负性:

    步长西湖水.png

    可得到未知参数最终的迭代计算公式:

    迭代公式43.png

    通过换元法变换步长系数不仅能确保矩阵分解后非负,还能简化计算变为矩阵乘法。

    三、NMF代码实现

        利用以上推导过程实现NMF,示例代码通过公式(4.3)求出(3.1)最优解后得到未知参数,并将分解后矩阵与sklearn自带的NMF算法比较,通过矩阵范数计算可以发现两者准确率是相同的。

    余下文章请访问链接 NMF分解

    展开全文
  • 资源名:非负矩阵分解_nmf_工具箱_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合人群:新手及有一定经验...
  • 可以直接在matlab里面运行的代码,不用自己编译,网上整理了好久的资源 计算机视觉 图形图像
  • 学习使用NMF非负矩阵分解算法

    千次阅读 2022-01-22 11:54:49
    NMF算法,脸谱识别

    0 背景

    NMF Ref: NMF 非负矩阵分解 -- 原理与应用_qq_26225295的博客-CSDN博客_nmf原理

    Ref: Dr Li 的notes ,包含PCA,SVD,EMF等算法。 给他写信咨询问题和索取资料,非常友善,及时给我答复,但我把姓搞错了。ECE484 Digital Image Processing - A Modern Approach (DIPAMA) Class Web Page: Fall 2019

    他的face数据集,后面放到共享资源里,或者 这个link下载Box

    大家也可下载yale的数据集:Popular Face Data Sets in Matlab Format

    他还给了2篇论文,Eigenfaces for Recognition 和  Eigenfaces vs. fisherfaces: Recognition using class specific linear projection

    1 目的

        使用NMF的初衷是为了将CWT的结果进行降维,清华的王天杨 有semi-NMF降维方法,但论文不太细致。

        以为NMF是直接对图像矩阵进行降维,获得特征,所以看了相关的论文,都是二维矩阵的推导。

       实际上X为样本数的合集,行为特征,列为样本数。

      因此,进行降维的样本需要转为1D 然后根据样本拼接为2D。 我也是进行实际案例操作时,发现这个问题。

    2 其他相关的降维方法

    数据集,6680张图片,每张400个特征,图片size 20*20=400.

     mean face

    % mean face
     meanFace=mean(faces,1);
    imgmeanFace=reshape(meanFace,20,20);
    figure,imshow(imgmeanFace)

    result

    2.1 PCA

         这方面的推导和讲解有大量的知识,这里还是copy Dr.Li 的notes

        我的理解是采用正交投影的方式,逐步将变量的特征提取,实现降维。

     

     用PCA进行特征提取

    code

    %% data faces-ids-n6680-m417-20x20.mat
    %% PCA(X)
    %Rows of X correspond to observations  样本数
    % and columns correspond to variables.   特征数
    [A, s, lat]=pca(faces);%[coeff,score,latent] = pca(___)
    h=20; w=20;
    figure(30);
    subplot(1,2,1); grid on; hold on; stem(lat,'.');
    title('Score')
    f_eng=lat.*lat;
    subplot(1,2,2); grid on; hold on; plot(cumsum(f_eng)/sum(f_eng),'.-');
    title('Total Score')

    Result:

    从由图可知,前6个PCAs就可以表征原来98%的特征信息,有效实现了降维。

    则可以取A的前6个主成分 进行降维,可将1*400 x 400*6=1*6的纬度。

    Principal component coefficients, returned as a p-by-p matrix. Each column of coeff contains coefficients for one principal component. The columns are in the order of descending component variance, latent.

    关于图片的聚类,我没有深入了解。大概浏览了参考文献,91年的那个有详细的推导。

    另外:如何获得特征向量对应的脸?

    利用PCA计算获得相关系A,lat特征向量,如何获得特征脸?


    用原来的样本*特征相关系数 不对,存在负值。。。。图片无法显示

     尝试 去掉负数

    %特征脸
    i=2;
    face1=faces(i,:)*A;%第i张脸的图谱
    face1((face1<0))=1;%负数去掉
    imgmeanFace=reshape(face1,20,20);
    figure,imshow(imgmeanFace)

    不做负数处理的结果如下。

    % fea=bsxfun(@minus,faces,mean(faces,1))*coef;%将原来的数据转换到新的样本空间中的算法是这样实现的。
    %   x0=fea*coef;
      imshow(reshape(x0(i,:),20,20))

     

       我没有得到特征face。 谁知道?

    3  NMF

    3.1 method

     

     因此组成V的数组,行为特征数,列为样本数。k为 选取的降维数,k<f*k/(f+k).

    W 特征、H为权重

     

    code

    v=faces(1:560,:)';%560 faces
    k=2;
    [W, H]=nnmf(v, k);

    Result

    看特征

     

     尝试对GPR 数据处理,模型处理结果不好。后续待改进。

    又进行了其他测试

       Moisture&Normal

    在沥青路面的数据中进行了处理,结果如下

     

    放大中心:

     说明可以对异常分类,这个交叉结果的主要原因是原始数据筛选不严格。

    Steel..

     

    上述分析表明NMF可作为特征分析工具,但对样本要求比较高。

    展开全文
  • nmf非负矩阵分解算法高维遥感图像维度压缩,主要进行nmf非负矩阵分解算法的数据降维。可任意降维。使用Python写成。
  • 行业分类-设备装置-一种基于NMF非负矩阵分解的音频分离方法.zip
  • Matlab非负矩阵分解NMF-NMF.ppt 非负矩阵分解讲义与程序 QQ截图未命名1.jpg QQ截图未命名2.jpg
  • PyTorch中的非负矩阵组合 PyTorch不仅是一个很好的深度学习框架,而且还是矩阵操作和大数据卷积方面的快速工具。 一个很好的例子是 。 在此程序包中,我基于torch.nn.Module在PyTorch中实现了NMF,PLC​​A及其反...
  • 非负矩阵分解的matlab代码,内容全,适用于各种信号的分析 非负矩阵分解的matlab代码,内容全,适用于各种信号的分析
  • NMF 非负矩阵分解

    2014-06-21 11:17:08
    这是著名的科学杂志《Nature》于1999年刊登了两位科学家D.D.Lee和H.S.Seung对数学中非负矩阵研究的突出成果的论文。该文提出了一种新的矩阵分解思想――非负矩阵分解(Non-negative Matrix Factorization,NMF)算法。
  • 基于非负矩阵分解,开发了一种有效的噪声平滑和边缘判别方法。 特别地,为了促进帧质量的提高,我们将深度序列分为三个状态。 极大地方便了背景模型和目标函数的求解过程。 在公共深度数据集上的仿真结果通过视觉...
  • 用于执行非负矩阵分解NMF)和多个变体的工具箱。 当前,代码在MATLAB中,但是计划创建Python版本,也可能创建C / C ++版本。 安装 克隆此存储库或下载zip版本。 在MATLAB中,将NMF Toolbox目录添加到路径。 主要...
  • 该项目使用非负矩阵分解NMF)。 使用NMF,将包含有关股票及其每日交易量的数据的原始数据矩阵(D)分解为两个结果矩阵W(权重矩阵)和H(特征矩阵),使得W * H≈D 。 通过分析H和W矩阵,可以识别某些特征,并...
  • 非负矩阵分解NMF)被证明是一种非常有效的分解方法,可用于数据分析中的降维,并且已广泛应用于计算机视觉,模式识别和信息检索中。 但是,NMF实际上是一种不受监督的方法,因为它无法利用有关数据的先验知识。 在...
  • NMF 非负矩阵分解 相关资料 程序 PPT

    热门讨论 2011-12-29 15:19:56
    NMF 非负矩阵分解 相关资料 程序 PPT A new nonnegative matrix factorization for independent component analysis Blind Image Separation Using Nonnegative Matrix Factorization with Gibbs Smoothing ...
  • NMF非负矩阵分解初探

    2018-07-04 17:48:30
    NMF非负矩阵分解初探 NMF非负矩阵分解初探 简介 NMF信号分解 最优化问题NMF 简介 数据可以表示为一个矩阵 VVV,列 vnvnv_n 是采样点而行代表特征features。我们想把这个矩阵VVV因式分解为两个未知的...

    NMF非负矩阵分解初探

    简介

    数据可以表示为一个矩阵 V V ,列 vn 是采样点而行代表特征features。我们想把这个矩阵 V V 因式分解为两个未知的矩阵 W H H

    VV^WH

    这里面 W W 是一个经常性出现的patterns的字典(比如音乐中的鼓点),而 H 中的每一列 hn h n 表示每一个采样点 vn v n 中估测存在的patterns。我们可以把 W W 称为字典(dictionary)而 H 成为激活矩阵(activation matrix)。同时我们也约定 V V 的维度是F × N。 W W 为 F × K, H H 为 K × N。

    上面的式子中的因式分解在其他的领域里面也叫做字典学习(dictionary learning)低维估计(low-rank approximation)等等。最有名的方法是PCA,通过最小化 V V WH的二次距离。别的方法有PCA的变体ICA,稀疏编码(sparse coding),而NMF则用在非负的数据上,并限制 W W H为非负矩阵。

    NMF信号分解

    下图是一个NMF工作的模式图,首先把音频转化为时频图,然后我们可以把他分解为特征字典和激活矩阵。

    NMFexample

    NMF 同样可以用在图像中,我们可以发现经过NMF分解,人脸可以分为各个部分(眼睛、鼻子、嘴巴),而PCA分解后的结果是特征脸(eigenfaces)。可以看出来,NMF一个很大的优势在于它的可解释性。

    NMFvsPCA

    Lee D D, Seung H S. Learning the parts of objects by non-negative matrix factorization[J]. Nature, 1999, 401(6755): 788.
    https://www.nature.com/articles/44565

    最优化问题NMF

    NMF 的因式分解可以看作一个最小化问题

    minW,HD(V|WH) subject to W0,H0 min W , H D ( V | W H )  subject to  W ≥ 0 , H ≥ 0

    D(V|WH)=f=1FN=1Nd([V]fn|[WH]fn) D ( V | W H ) = ∑ f = 1 F ∑ N = 1 N d ( [ V ] f n | [ W H ] f n )

    d(x|y) d ( x | y ) 是cost function,在别的应用中比较流行的选择是二次成本函数(quadratic cost function) dQ(x|y)=12(xy)2 d Q ( x | y ) = 1 2 ( x − y ) 2 。但它并不是很适合NMF。在音频信号处理应用中比较成功的cost function是 β-divergence。

    β-divergence

    根据β-divergence导出的更新的公式如下:

    update-rule

    每次迭代,更新 W W H H

    总体的流程如下:

    1. 输入一段音频,将音频通过短时傅里叶变换转化到时频谱( V V
    2. 选择一个W H H 的共有维度K,初始化W H H ,注意其中所有元素都要是非负的。
    3. 使用上面的公式更新W H H <script type="math/tex" id="MathJax-Element-436">H</script>。
    展开全文
  • 非负矩阵分解的 python 端口。 2014年 原始matlab代码在这里: 论文:参见 N. Gillis、D. Kuang 和 H. Park,“使用 Rank-Two Nonnegative Matrix Factorization 的高光谱图像分层聚类”,IEEE Trans。 地球科学与...
  • 主成分分析(PCA ) 主成分分析(Principal Component Analysis , PCA )是最常用的一种降维方法,通常用于高维数据集的探索与可视化,还可以用作数 据压缩和预处理等。 PCA可以把具有相关性的高维变量...协方差矩阵 ...
  • NMF在主题建模中的实现 利用乘法更新规则实现非负矩阵分解,以发现有用的主题
  • NMF 非负矩阵分解 -- 原理与应用

    万次阅读 多人点赞 2016-04-21 18:13:16
    NMF,全称为non-negative matrix factorization,中文呢为“非负矩阵分解”。NMF的思想:V=WH(W权重矩阵、H特征矩阵、V原矩阵),通过计算从原矩阵提取权重和特征两个不同的矩阵出来。属于一个无监督学习的算法。
  • nmf的matlab代码
  • 资源名:用于人脸识别的NMF分解程序_非负矩阵分解_matlab源码 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合...
  • 非负矩阵分解(NMF)常用于寻找非负数据的线性表示,可以有效解决混合像元问题。基于丰度的稀疏性和图像局部不变性提出一种高光谱解混算法。对丰度采取稀疏性约束和基于拉普拉斯矩阵的图正则项约束,构造了一个新的目标...
  • 原文地址 1. NMF-based 推荐算法 ...用户和电影的关系,可以用一个矩阵来表示,每一列表示用户,每一行表示电影,每个元素的值表示用户对已经看过的电影的打分。下面来简单介绍一下基于NMF的推荐算法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,820
精华内容 728
关键字:

nmf非负矩阵分解