大致步骤:
- 导入数据
一共有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