我是靠谱客的博主 醉熏大象,最近开发中收集的这篇文章主要介绍无监督学习-NMF-降维-人脸特征的提取-所有的代码解释和分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

实验目标

目标︰已知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-降维-人脸特征的提取-所有的代码解释和分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部