python-非负矩阵分解-NMF
作者:互联网
非负矩阵分解
非负矩阵分解是矩阵中所有元素均为非负数约束条件下的矩阵分解,其基本思想:给定一个非负矩阵V,NMF能够找到一个非负矩阵W和一个非负矩阵H,使得矩阵W和矩阵H的乘积近似等于矩阵V中的值。
- 矩阵:被称为基础图像数据,相当于从原始矩阵中抽取出来的特征。
- H矩阵:系数矩阵
- NMF广泛应用于图像分析,文本挖掘和语音处理邻域。
- NMF矩阵分解优化目标:最小化W矩阵H矩阵的乘积和原始矩阵之间的差别。
- 传统目标函数:
- 基于KL散度的优化目标,损失函数如下:
- 在sklearn库中,可以使用sklearn.decomposition.NMF加载NMF算法,主要参数有:
- n_components:用于指定分解后矩阵的单个维度k;
- init:W矩阵和H矩阵的初始化方式,默认为nndsvdar。
- 其他
- 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()#可视化
标签:plt,非负,python,矩阵,NMF,components,row 来源: https://blog.csdn.net/TxyITxs/article/details/94036552