python-非负矩阵分解-NMF

非负矩阵分解

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

                                       V_{n*m}=W_{n*k}*H_{k*m}

  1. W矩阵:被称为基础图像数据,相当于从原始矩阵V中抽取出来的特征。
  2. H矩阵:系数矩阵
  3. NMF广泛应用于图像分析,文本挖掘和语音处理邻域。
  4. NMF矩阵分解优化目标:最小化W矩阵H矩阵的乘积和原始矩阵之间的差别。
    1. 传统目标函数:                                                                                              argmin\frac{1}{2}||X-WH||^2=\frac{1}{2}\sum_{i,j}(X_{ij}-WH_{ij})^2
    2. 基于KL散度的优化目标,损失函数如下:                                       argminJ(W,H)=\sum_{ij}(X_{ij}ln\frac{X_{ij}}{WH_{ij}}-X_{ij}+WH_{ij})
  5. 在sklearn库中,可以使用sklearn.decomposition.NMF加载NMF算法,主要参数有:
    1. n_components:用于指定分解后矩阵的单个维度k;
    2. init:W矩阵和H矩阵的初始化方式,默认为nndsvdar。
    3. 其他
  6. NMF实例:
    #非负矩阵分解(NMF):
    
    '''
        1.NMF 人脸数据特征提取
        目标:已知Olivetti 人脸数据供400个,每个数据64*64,
        由于NMF分解得到的W矩阵相当于从原始矩阵中提取的特征,
        那么就可以使用NMF对400个人的人脸进行特征提取。
    
        2.通过设置k的大小可以设置提取的特征数目,在本实验中k设置为6,随后提取特征以图像的形式展示出来
        
    '''
    
    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_col                        #设置提取的特征数目
    image_shape=(64,64)                             #设置人脸数据图片大小
    dataset=fetch_olivetti_faces(shuffle=True,random_state=RandomState(0))
    faces=dataset.data                              #加载数据,打乱顺序
    
    #设置图像的展示方式
    def plot_gallery(title,images,n_col=n_col,n_row=n_row):
        plt.figure(figsize=(2.*n_col,2.26*n_row))   #创建图片,指定大小
        plt.suptitle(title,size=16)                 #设置标题,字号大小
    
        for i,comp in enumerate(images):
            plt.subplot(n_row,n_col,i+1)            #选择画制的子图
            vmax=max(comp.max(),-comp.min())
    
            plt.imshow(comp.reshape(image_shape),cmap=plt.cm.gray,
                       interpolation='nearest',   #对数值归一化,并以灰度图形显示
                       vmin=-vmax,vmax=vmax)
            plt.xticks(())
            plt.yticks(())                         #去除子图坐标标签
        plt.subplots_adjust(0.01,0.05,0.99,0.93,0.)#子图间隔调整
    
    
    estimators=[('Eigenfaces -PCA using randomized SVD',
                 decomposition.PCA(n_components=6,whiten=True)),
                ('Non -negative components -NMF',#NMF和PCA实例化并存储在列表之中
                 decomposition.NMF(n_components=6,init='nndsvda',
                                   tol=5e-3))]
    
    
    for name ,estimator in estimators:
        estimator.fit(faces)                    #NMF和PCA分别调用提取特征
        components_=estimator.components_
        #获取特征
        plot_gallery(name,components_[:n_components])
        #按照国定格式进行排列
        
    if __name__=="__main__":
        plt.show()#可视化
    
    

发布了89 篇原创文章 · 获赞 8 · 访问量 8902

猜你喜欢

转载自blog.csdn.net/TxyITxs/article/details/94036552