模式识别与机器学习(作业4)

基于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

你可能感兴趣的:(模式识别与机器学习)