基于PCA–LDA的人脸识别

ORC数据集
提取码: cggh

本次的实验是在模式识别与机器学习(作业4),PCA降维的基础上加入了线性判别分析,对维度进行了进一步的降低。

1. 导入数据

一共有40个人脸,每个人脸10张图片,8张用于训练,2张用于测试。所以训练集有320张图片,测试集有80张图片。图像的分辨率为112*92,我们将其reshape为(1,10304)。由此得到训练集(320,10304),测试集(180,10304)

#%%导入数据
import numpy as np
import cv2
import os.path as osp
import os
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
#训练集路径
osp.abspath(".")
#导入训练数据
train_x,train_y = [],[]
for i in os.listdir(osp.join(osp.realpath("."),"train_1")):img = cv2.imread(osp.join(osp.realpath("."),"train_1",i),0)train_x.append(np.reshape(img,(1,-1)))a,_ = i.split("_")train_y.append(a)
test_x,test_y = [],[]
for i in os.listdir(osp.join(osp.realpath("."),"test")):img = cv2.imread(osp.join(osp.realpath("."),"test",i),0)test_x.append(np.reshape(img,(1,-1)))a,_ = i.split("_")test_y.append(a)
train_x = np.array(train_x,dtype = np.float32).squeeze(1)
train_y = np.array(train_y)
test_x = np.array(test_x,dtype = np.float32).squeeze(1)
test_y = np.array(test_y)

2. PCA降维

在训练时,最初采用的是特征值分解的方法,但是存在的问题是,因为维度较高,特征分解时间较长,并且分解后的特征向量存在虚数,不利于识别。因此,我采用了第二种方法,SVD分解的方法**(保留前80个维度)**,具体的步骤请参照李航博士《统计学习原理》第二版一书(page336),这里不再一一赘述。

class PCA:#定义K近邻的值必须大于1def __init__(self):self.x_train_fit = Noneself.y_train_fit = Noneself.u = Noneself.s = Noneself.vh = Nonedef fit(self,x_train,y_train):self.x_train_fit = x_trainself.y_train_fit = y_trainreturn self#中心化,建立模型def Centralization(self,X):Centra = X - np.mean(self.x_train_fit,axis = 0)return Centradef model(self):#定义一个新矩阵X_ = (1/np.sqrt(len(self.Centralization(self.x_train_fit))))*self.Centralization(self.x_train_fit)#进行奇异值分解self.u, self.s, self.vh = np.linalg.svd(X_)#降维def transform(self,X,K):X = self.Centralization(X)X_dunction = (((self.vh).T[:,:K]).T).dot(X.T).Treturn X_dunction
#%%
pca = PCA()
pca.fit(train_x,train_y)
pca.model()
k=80
X_test_dunction_1 = pca.transform(test_x,k)
X_train_dunction_1 = pca.transform(train_x,k)

3. LDA降维

LDA也可以推广到了多分类的任务当中。假定存在 NNN个类,且第iii 类示例数为mim_imi​我们先定义"全局散度矩阵"。
St=Sb+Sw=∑i=1m(xi−μ)(xi−μ)T\begin{aligned} &\mathbf{S}_{t}=\mathbf{S}_{b}+\mathbf{S}_{w}\\ &=\sum_{i=1}^{m}\left(x_{i}-\mu\right)\left(x_{i}-\mu\right)^{\mathrm{T}} \end{aligned}​St​=Sb​+Sw​=i=1∑m​(xi​−μ)(xi​−μ)T​
其中uuu是所有示例样本的均值,xix_ixi​为第iii类样本的示例。
我们还要重新定义多分类任务的类内散度SwS_wSw​,即每个类别的散度矩阵之和:
Sw=∑i=1NSwi\mathbf{S}_{w}=\sum_{i=1}^{N} \mathbf{S}_{w_{i}}Sw​=i=1∑N​Swi​​
其中Swi=∑x∈Xi(x−μi)(x−μi)T\mathbf{S}_{w_{i}}=\sum_{\boldsymbol{x} \in X_{i}}\left(\boldsymbol{x}-\boldsymbol{\mu}_{i}\right)\left(\boldsymbol{x}-\boldsymbol{\mu}_{i}\right)^{\mathrm{T}}Swi​​=x∈Xi​∑​(x−μi​)(x−μi​)T
由以上公式可以知道
Sb=St−Sw=∑i=1Nmi(μi−μ)(μi−μ)T\begin{aligned} \mathbf{S}_{b} &=\mathbf{S}_{t}-\mathbf{S}_{w} \\ &=\sum_{i=1}^{N} m_{i}\left(\boldsymbol{\mu}_{i}-\boldsymbol{\mu}\right)\left(\boldsymbol{\mu}_{i}-\boldsymbol{\mu}\right)^{\mathrm{T}} \end{aligned}Sb​​=St​−Sw​=i=1∑N​mi​(μi​−μ)(μi​−μ)T​
其中SbS_bSb​为类间散度,mim_imi​表示的为类别,在本题目中有40个类别。uiu_iui​是同一类别下的特征均值。
一般的我们可以利用如下公式,进行求解,其中WWW就是一个投影矩阵,我们可以选取特征值最大的前K个,用于特征的降维。
SbW=λSwW\mathbf{S}_{b} \mathbf{W}=\lambda \mathbf{S}_{w} \mathbf{W}Sb​W=λSw​W

#%%导入数据
#%%算法的判别
#需要计算肋间方差和类内方差
import collections
#求取所用示例的均值向量(k,),k表示降维后的数据
mean_u = np.mean(X_train_dunction_1,axis = 0)
#求取类间散度矩阵,和类内散度矩阵
S_b = np.zeros((X_train_dunction_1.shape[1],X_train_dunction_1.shape[1]))
S_w = np.zeros((X_train_dunction_1.shape[1],X_train_dunction_1.shape[1]))
get_class =  collections.Counter(train_y).keys()
for classes in get_class:x_i = np.array([x_i for x_i,i in zip(X_train_dunction_1,train_y) if i == classes])mean_u_i = np.mean(x_i,axis = 0)#类间散度矩阵S_b = S_b + (mean_u_i - mean_u).reshape(-1,1).dot((mean_u_i - mean_u).reshape(1,-1))#类内散度矩阵,西瓜书公式3.41,3.42S_w = S_w + (x_i - mean_u_i).T.dot(x_i - mean_u_i)
#类间散度矩阵,西瓜书公式3.43
S_b = S_b * len(get_class)
#进行特征值分解
eig_vals, eig_vecs = np.linalg.eig(np.linalg.inv(S_w).dot(S_b))
#对特征值进行由高到低的排序
eig_vecs = np.array([eig_vecs[:,i] for i in np.argsort(-eig_vals)])
#%%求取准确度
for k in range(1,40):X_train_dunction_2 = X_train_dunction_1.dot(eig_vecs[:,:k])X_test_dunction_2 = X_test_dunction_1.dot(eig_vecs[:,:k])accu = 0for i in range(len(test_y)):a = [np.linalg.norm(X_test_dunction_2[i,:] - X_train_dunction_2[j,:]) for j in range(len(train_y))]min_dix = np.argmin(a)if train_y[min_dix] == test_y[i]:accu += 1print("保留前{}维的准确度为{}".format(k,accu/80))

结果

保留前1维的准确度为0.0875
保留前2维的准确度为0.425
保留前3维的准确度为0.575
保留前4维的准确度为0.7125
保留前5维的准确度为0.8
保留前6维的准确度为0.85
保留前7维的准确度为0.875
保留前8维的准确度为0.8875
保留前9维的准确度为0.875
保留前10维的准确度为0.8625
保留前11维的准确度为0.875
保留前12维的准确度为0.9125
保留前13维的准确度为0.9375
保留前14维的准确度为0.9125
保留前15维的准确度为0.9375
保留前16维的准确度为0.95
保留前17维的准确度为0.9375
保留前18维的准确度为0.9125
保留前19维的准确度为0.9625
保留前20维的准确度为0.9625
保留前21维的准确度为0.9625
保留前22维的准确度为0.9625
保留前23维的准确度为0.9625
保留前24维的准确度为0.975
保留前25维的准确度为0.975
保留前26维的准确度为0.975
保留前27维的准确度为0.9625
保留前28维的准确度为0.9625
保留前29维的准确度为0.9625
保留前30维的准确度为0.95
保留前31维的准确度为0.9625
保留前32维的准确度为0.95
保留前33维的准确度为0.9625
保留前34维的准确度为0.9625
保留前35维的准确度为0.9625
保留前36维的准确度为0.9625
保留前37维的准确度为0.95
保留前38维的准确度为0.9625
保留前39维的准确度为0.975

有测试结果得出,在本实验中保留前24维,准确度可以达到最佳。

模式识别与机器学习(作业5)基于PCA–LDA的人脸识别相关推荐

  1. 基于PCA 人脸识别/人脸识别算法/人脸检测程序源码MATLAB ELM+PCA人脸识别 PCA人脸识别matlab代码 基于PCA算法的人脸识别

    1.基于PCA的人脸识别代码 2.MATLAB ELM+PCA人脸识别 2.基于PCA的人脸识别(matlab)(采用PCA算法进行人脸识别,通过抽取人脸的主要成 分,构成特征脸空间,识别时将测试图像 ...

  2. 基于PCA方法的人脸识别(Python)

    目录 1.PCA简介 2.照片要求 3.创建训练人脸库的特征脸空间 3.1:创建所有训练样本组成的 M×N 矩阵 3.2:计算训练样本的平均值矩阵 3.3:去除平均值,得到规格化后的训练样本矩阵 3. ...

  3. 基于DeepFace模型设计的人脸识别软件

    资源下载地址:https://download.csdn.net/download/sheziqiong/85601096 人脸识别软件(无外部API) V2.0 基于DeepFace模型设计的人脸识 ...

  4. 【机器学习】基于PCA/LDA的数据降维和可视化(二维+三维)

    基于PCA/LDA的数据降维和可视化 Introduction Project Intro File Intro Tools Intro Code&Dataset Link Process P ...

  5. 模式识别PCA方法实现人脸识别-Python

    模式识别PCA方法实现人脸识别-Python 一.学习目标 二.学习内容 三.学习时间 四.学习产出 五.正文部分 1.什么是PCA? 2.使用PCA方法进行人脸识别的步骤 1)前期尝试及准备 (1) ...

  6. 基于全局信息的人脸识别总结

    一.           课题名称 基于全局信息的人脸识别算法研究 二.           课题的提出 在当今社会中,身份确认具有十分重要的价值.随着网络技术的发展,信息安全也显示出了前所未有的重要 ...

  7. 基于改进的RPCA人脸识别算法

    from:http://www.chinaaet.com/article/3000011311 基于改进的RPCA人脸识别算法 作者:首照宇,杨晓帆,莫建文 2015/11/15 18:04:00 摘 ...

  8. 基于kl变换的人脸识别_简述几种人脸识别的主要方法

    人脸识别的方法很多,以下介绍一些主要的人脸识别方法.(1)几何特征的人脸识别方法几何特征可以是眼.鼻.嘴等的形状和它们之间的几何关系(如相互之间的距离).这些算法识别速度快,需要的内存小,但识别率较低 ...

  9. 基于Android系统的人脸识别签到软件

    项目名称:   基于Android系统的人脸识别签到软件 目  录 1 项目介绍..... 1 1.1 项目背景.... 1 1.2 产品特点.... 2 1.3 可行性分析.... 2 1.3.1 ...

最新文章

  1. 深度学习中图片数据增强方法
  2. 【深入剖析Tomcat笔记】第一篇 基础知识储备
  3. jointGrid,边际的颜色和hue保持一致,添加title
  4. linux用户管理最常用的三个文件说明(不完整版)
  5. AutoLisp:AutoLisp实现对AutoCAD进行输入命令,选择对象,实现不同方向进行缩放
  6. 【技巧】数组元素相加等于某个目标值,js实现
  7. Scala _02基础
  8. 跟老板参加饭局,席间老板叫我去加菜,我该怎么做?
  9. 运用cnn实现手写体(mnist)数字识别_实现 MNIST 手写数字识别
  10. GridView 换行设置
  11. 现在哪款诺基亚能玩Java游戏_回忆S60(塞班)年代的JAVA游戏:有没有哪一款是你在课堂偷偷玩的?...
  12. SWS_BICUBIC未声明的标识符解决方法
  13. 职场感悟.Video.人生各自精彩,谁说人生是一场马拉松的?
  14. c语言以字符输出88,C语言88案例完整版
  15. [Brute force][规律] Jzoj P3084 超级变变变
  16. 《java从入门到放弃》_《Java从入门到放弃》JavaSE入门篇:JDBC(入门版)
  17. 一个屌丝程序猿的人生(一百二十二)
  18. 自定义UIView实现了动态心率图和血压器
  19. Spark实时项目所遇错误,启动SpringBoot收集数据发现数据能读取但全是清一色的404的数据
  20. 软件测试外包服务有什么好处,费用是多少?

热门文章

  1. Ubuntu桌面卡死解决办法
  2. Java Swing扫雷游戏demo分享
  3. 贝尔曼最优方程(Bellman Optimality Equation)
  4. bat脚本的常用特殊符号
  5. CF896C Willem, Chtholly and Seniorious(珂朵莉树)
  6. 01 创建一个二维地图
  7. 我的十年 谨以此文迎接我即将到来的三十而立
  8. 化工原理计算机辅助设计,化工原理课程设计总结与体会
  9. Word如何调整页边距
  10. 大批量查询京东快递物流,并分析到站延误