机器学习笔记(十五):人脸识别

凌云时刻 · 技术

导读:PCA有一个典型的实际应用,就是人脸识别。我们这一节就来简单看看PCA在人脸识别中的应用。

作者 | 计缘

来源 | 凌云时刻(微信号:linuxpk)

高维数据向低维数据映射

首先我们还是先从PCA的原理来说,PCA就将高维数据降至相对的低维数据,但是这些低维的数据却能反应了原始高维数据的绝大多数主要特征。那么由PCA训练出的这些主成分其实就代表了原始数据的主要特征。那么如果原始高维数据是一张张不同的人脸数据时,那么由PCA训练出的主成分其实就是这一张张人脸的主要特征,称为特征脸。好比,爷爷,爸爸,儿子三个人长的很像,其实是这三张人脸有共同的特征脸。下面我们就使用Scikit Learn中提供的人脸数据来看看特征脸的应用。

 

import numpy as np
import matplotlib.pyplot as plt

# 导入人脸数据集
from sklearn.datasets import fetch_lfw_people

# 导入人脸数据集(这里需要等一阵,因为需要下载数据)
faces = fetch_lfw_people()
faces.data.shape
# 结果
(13233, 2914)

faces.images.shape
# 结果
(13233, 62, 47)

如果网络不好的朋友,可以去这里手动下载All images aligned with funneling数据集,然后在使用fetch_lfw_people()时需要增加data_home这个参数,指定你存放数据集的目录,比如fetch_lfw_people(data_home='/XXX/XXX')然后执行,Scikit Learn就会去你指定的目录下解压lfw_funneled压缩包,抓取数据。从上面代码结果可以看到,这个人脸的数据集一共有13233张人脸图片,每张人脸图片有2914个特征,其实也就是由2914个不同值的像素组成,通过faces.images.shape我们知道这13233张图片的大小是62乘以47像素,相乘的值正好就是2914。

因为这个数据集里人脸的分布并不均匀,所以我们在用之前先将其进行随机处理:

 

# 求一个随机索引
random_indexs = np.random.permutation(len(faces.data))
X = faces.data[random_indexs]

# 取前36张脸进行展示
example_faces = X[:36, :]

# 定义一个显示人脸图片的方法
def plot_faces(data):
	# 构建尺寸为12 X 12的画图区域,既每行12个图片,一共12行
	plt.figure(figsize=(12, 12))
	# 遍历加了噪音的手写数字数据
	for index, imageData in enumerate(data):
		# 图片分布为6行6列,正好36张图片,第三个参数是每张图片的位置
		plt.subplot(6, 6, index + 1)
		# 将有2914个元素的数组转换为62 X 47的矩阵,既62 X 47个像素的图片
		image = np.reshape(imageData, (62, 47))
		plt.imshow(image, cmap = 'bone')
	
	plt.show()

 

 

然后我们通过PCA求出这个13233条样本数据,2914维特征数据集的所有主成分。所有主成分要等于小于样本数据的特征数量。下面来求这个样本数据集的最大维度:

 

from sklearn.decomposition import PCA
# 求出样本数据的最大主成分数
pca = PCA(svd_solver='randomized')
pca.fit(X)

pca.components_.shape
# 结果
(2914, 2914)

# 查看前36个主成分的方差比率
pca.explained_variance_ratio_[:36]

# 结果
array([ 0.23333138,  0.10693729,  0.08233336,  0.07026902,  0.03252576,
		0.03012665,  0.0210468 ,  0.01823955,  0.01764975,  0.0158582 ,
		0.01480933,  0.01337274,  0.01252589,  0.01161669,  0.01068777,
		0.00960774,  0.00873549,  0.00775879,  0.00771184,  0.00693537,
		0.00674195,  0.00626633,  0.00590671,  0.00531572,  0.00512598,
		0.00500887,  0.0048442 ,  0.00466389,  0.00435357,  0.0041365 ,
		0.00390986,  0.00387675,  0.00366964,  0.0035524 ,  0.00342629,
		0.00328901], dtype=float32)
		
# 绘制前36个主成分,既最能描述人脸特征的成分
plot_faces(pca.components_[:36, :])

从代码结果可以看出,主成分的方差比率由大到小排序,第一个主成分能表示23.33%的人脸特征,从图上也能看到,第一个图显示了一个人脸的整个脸庞,第二个图显示了人脸的五官位置等。图中的这些脸就是特征脸,可以清晰的看到特征脸依次显示人脸特征的变化过程。

 

  

 

END

往期精彩文章回顾

机器学习笔记(十四):主成分分析法(PCA)(2)

机器学习笔记(十三):主成分分析法(PCA)

机器学习笔记(十二):随机梯度下降

机器学习笔记(十一):优化梯度公式

机器学习笔记(十):梯度下降

机器学习笔记(九):多元线性回归

机器学习笔记(八):线性回归算法的评测标准

机器学习笔记(七):线性回归

机器学习笔记(六):数据归一化

机器学习笔记(五):超参数

长按扫描二维码关注凌云时刻

每日收获前沿技术与科技洞见

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值