非负矩阵分解
非负矩阵分解是矩阵中所有元素均为非负数约束条件下的矩阵分解,其基本思想:给定一个非负矩阵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()#可视化