基于PCA降维的人脸识别
数据集: https://pan.baidu.com/s/1H1hzKGz2sjYB85Io1Uvr8A 提取码: cggh
大致步骤:
- 导入数据
一共有40个人脸,每个人脸10张图片,8张用于训练,2张用于测试。所以训练集有320张图片,测试集有80张图片。图像的分辨率为112*92,我们将其reshape为(1,10304)。由此得到训练集(320,10304),测试集(180,10304) - PCA降维
在训练时,最初采用的是特征值分解的方法,但是存在的问题是,因为维度较高,特征分解时间较长,并且分解后的特征向量存在虚数,不利于识别。因此,我采用了第二种方法,SVD分解的方法,具体的步骤请参照李航博士《统计学习原理》第二版一书(page336),这里不再一一赘述。 - KNN分类
在程序中我使用Sklearn的封装包,并遍历的特征向量所取个数与精度的关系,以寻找精度与速度的最佳平衡点。
#%%导入数据
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)
#%%
class PCA:
#定义K近邻的值必须大于1
def __init__(self):
self.x_train_fit = None
self.y_train_fit = None
self.u = None
self.s = None
self.vh = None
def fit(self,x_train,y_train):
self.x_train_fit = x_train
self.y_train_fit = y_train
return self
#中心化,建立模型
def Centralization(self,X):
Centra = X - np.mean(self.x_train_fit,axis = 0)
return Centra
def 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).T
return X_dunction
#%%
pca = PCA()
pca.fit(train_x,train_y)
pca.model()
#%%
for k in range(1,320):
X_test_dunction_1 = pca.transform(test_x,k)
X_train_dunction_1 = pca.transform(train_x,k)
knn_clf1 = KNeighborsClassifier()
knn_clf1.fit(X_train_dunction_1, train_y)
y_pre = knn_clf1.predict(X_test_dunction_1)
print("准确率为:",accuracy_score(y_pre,test_y))
结果
准确率为: 0.1
准确率为: 0.3875
准确率为: 0.5625
准确率为: 0.625
准确率为: 0.7
准确率为: 0.7625
准确率为: 0.8
准确率为: 0.825
准确率为: 0.8375
准确率为: 0.825
准确率为: 0.85
准确率为: 0.8875
准确率为: 0.875
准确率为: 0.8875
准确率为: 0.8875
准确率为: 0.875
准确率为: 0.875
准确率为: 0.875
准确率为: 0.9
准确率为: 0.9
准确率为: 0.9
准确率为: 0.9125
准确率为: 0.9125
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.9125
准确率为: 0.9125
准确率为: 0.9125
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.925
准确率为: 0.9125
准确率为: 0.9125
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.9375
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.95
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.925
准确率为: 0.925
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.95
准确率为: 0.9375
准确率为: 0.95
准确率为: 0.95
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.925
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.925
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.9375
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95
准确率为: 0.95