概述
实验目标
目标︰已知Olivetti人脸数据共400个,每个数据是64*64大小。由于NMF分解得到的W矩阵相当于从原始矩阵中提取的特征,那么就可以使用NMF对400个人脸数据进行特征提取。
逐个方法分析
数据集的参数说明
dataset = fetch_olivetti_faces(shuffle=True, random_state=RandomState(0))
faces = dataset.data
- shuffle:如果是的True,数据集的顺序就会被调整,防止获取同一组人的图像
- random_state:决定数据集调整的随机数的代数,指定random的不同数字,会出现不同的脸
- 如果将shuffle换成false,会出现同一张脸的六幅图片
图片展示的调整
# 设置图片展示的格式,images是图像类的数据
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)
# i是计数器,comp是具体的对象,
for i, comp in enumerate(images):
# 选择绘制的子图的位置,subplot是从上到下从左到右,从1开始计数的,索引是从零开始计数的
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.94, 0.04, 0.)
- plt.figure():
- 创建一个新的图片窗口,大小是2. * n_col, 2.26 * n_row
- fogsize(float,float)
- plt.suptitle(title,size = 16):
- 在figure中创建一个居中的题头,字体大小是16
- title是将要显示在figure中的文字
- fontsize:对应的字体的大小
- plt.imshow():将数据展示为图片,或者2D的光栅图
- 输入RGB的数组或者2D的光栅图,最终的被显示为伪彩色图
- 展示灰度图片要设定参数cmap、vmin和vmax
- interpolation差值:nearest对图片进行粗采样,可以不写,默认是抗锯齿化的,图片看上去更加的光滑
- xticks,yticks:设置每一个图片的对应横纵坐标值标记,这里是传入空值,如果去除是如下的效果
算法调用函数的解释
estimators = [
# 提取方法的名称-对应的方法的实例
('Eigenfaces - PCA using randomized SVD',
decomposition.PCA(n_components=6, whiten=True)),
('Non-negative components - NMF',
decomposition.NMF(n_components=6, init='nndsvda', tol=5e-3))
]
# 分别调用PCA和NMF
for name, estimator in estimators:
print("Extracting the top %d %s..." % (n_components, name))
print(faces.shape)
# 调用PCA和NMF提取特征
estimator.fit(faces)
# 获取提取的特征
components_ = estimator.components_
# 按照固定的格式进行排列
plot_gallery(name, components_[:n_components])
- estimate:是PCA和NMF两个方法生成的实体对象的数组
- estimator.fit(faces):遍历estimate中的两种方法的实体,并将实际的测试数据填入其中
- components_ = estimator.components:生成的返回的对象
- components_[:n_components]:获取提取到的特征的数量,前六个
实现代码
# 创建随机数种子
from numpy.random import RandomState
import matplotlib.pyplot as plt
# 加载人脸识别的数据集
from sklearn.datasets import fetch_olivetti_faces
# 加载降维的模块
from sklearn import decomposition
# 设置图像展示时的排列情况,一次画板展示六幅图片
n_row, n_col = 4, 3
# 设置特征提取的数量,总共是6个
n_components = n_row * n_col
# 设置人脸图片的大小
image_shape = (64, 64)
###############################################################################
# 加载人脸的数据集,并且打乱人脸的顺序
dataset = fetch_olivetti_faces(shuffle=True, random_state=RandomState(3))
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=6)
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,
vmin=-vmax, vmax=vmax)
# 对子图位置以及间隔进行调整
plt.subplots_adjust(0.01, 0.05, 0.99, 0.94, 0.04, 0.)
plot_gallery("First centered Olivetti faces", faces[:n_components])
###############################################################################
# 创建特征提取的对象的NMF,使用PCA作对比
estimators = [
# 提取方法的名称-对应的方法的实例
('Eigenfaces - PCA using randomized SVD',
decomposition.PCA(n_components=12, whiten=True)),
('Non-negative components - NMF',
decomposition.NMF(n_components=12, init='nndsvda', tol=5e-3))
]
###############################################################################
# 降维之后数据点的可视化
# 分别调用PCA和NMF
for name, estimator in estimators:
print("Extracting the top %d %s..." % (n_components, name))
print(faces.shape)
# 调用PCA和NMF提取特征
estimator.fit(faces)
# 获取提取的特征
components_ = estimator.components_
# 按照固定的格式进行排列
plot_gallery(name, components_[:n_components])
plt.show()
最后
以上就是醉熏大象为你收集整理的无监督学习-NMF-降维-人脸特征的提取-所有的代码解释和分析的全部内容,希望文章能够帮你解决无监督学习-NMF-降维-人脸特征的提取-所有的代码解释和分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复