SVM-支持向量机-人脸识别学习代码

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
import seaborn as sns;sns.set()
from sklearn.datasets import fetch_lfw_people
faces = fetch_lfw_people(min_faces_per_person=60)
print(faces.target_names)
print(faces.images.shape)
fig,ax = plt.subplots(3,5)
for i,axi in enumerate(ax.flat):
    axi.imshow(faces.images[i],cmap='bone')
    axi.set(xticks=[],yticks=[],xlabel=faces.target_names[faces.target[i]])

在这里插入图片描述

  • 每一幅图的尺寸为[62x47] ,大约3000个像素值,我们可以将整个图像展平为-一个长度为3000左右的一维向量,然后使用这个向量做为特征.通常更有效的方法是通过预处理提取图像最重要的特征. -个重要的特征提取方法是PCA(主成分分析),可以将-副图像转换为-一个长度为更短的(150)向量.
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
pca = PCA(n_components=150,whiten=True,random_state=42)
svc = SVC(kernel='linear',class_weight='balanced')
model = make_pipeline(pca,svc)
#将数据分为训练和测试数据集
from sklearn.model_selection import train_test_split
xtrain,xtest,ytrain,ytest = train_test_split(faces.data,faces.target,random_state=42)
#调参:通过交叉验证寻找最佳的C (控制间隔的大小
from sklearn.model_selection import GridSearchCV
param_grid = {'svc__C': [1, 5, 10, 50]}
grid = GridSearchCV(model, param_grid)
%time grid.fit(xtrain, ytrain)
print(grid.best_params_)
model = grid.best_estimator_
yfit = model.predict(xtest)
#使用训练好的SVM做预测
fig,ax = plt.subplots(4,6)
for i,axi in enumerate(ax.flat):
    axi.imshow(xtest[i].reshape(62,47),cmap='bone')
    axi.set(xticks=[],yticks=[])
    axi.set_ylabel(faces.target_names[yfit[i]].split()[-1],color='black' if yfit[i]==ytest[i] else 'red')

在这里插入图片描述

#生成性能报告
from sklearn.metrics import classification_report
print(classification_report(ytest,yfit,target_names = faces.target_names))
#混淆矩阵
from sklearn.metrics import confusion_matrix
mat = confusion_matrix(ytest,yfit)
sns.heatmap(mat.T,square=True,annot=True,fmt='d',cbar=False,xticklabels=faces.target_names,yticklabels=faces.target_names)
plt.xlabel('true label')
plt.ylabel('predicted label');

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值