机器学习:基于支持向量机(SVM)进行人脸识别预测
机器学习:基于支持向量机(SVM)进行人脸识别预测
文章目录
- 机器学习:基于支持向量机(SVM)进行人脸识别预测
- 一、实验目的
- 二、实验原理
- 三、实验环境
- 四、实验内容
- 五、实验步骤
- 1.准备数据
- 2.业务理解
- 3.数据理解
- 4.数据划分为测试集和训练集
- 5.模型构建
- 6.参数调整
- 7.预测测试集的人名编号
- 8.显示预测结果
- 9.分析预测结果的准确性
- 10.完整代码
- 总结
一、实验目的
1.理解SVM原理
2.掌握scikit-learn操作SVM的方法
二、实验原理
SVM(Support Vector Machine)指的是支持向量机,是常见的一种判别方法。在机器学习领域,是一个有监督的学习模型,通常用来进行模式识别、分类以及回归分析。通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的情况下,亦能获得良好统计规律的目的。通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
具体原理:
1.在n维空间中找到一个分类超平面,将空间上的点分类。如下图是线性分类的例子。
2.一般而言,一个点距离超平面的远近可以表示为分类预测的确信或准确程度。SVM就是要最大化这个间隔值。而在虚线上的点便叫做支持向量Supprot Verctor。
3.实际上,我们会经常遇到线性不可分的样例,此时,我们的常用做法是把样例特征映射到高维空间中去(如下图);
4.线性不可分映射到高维空间,可能会导致维度大小高到可怕(19维乃至无穷维的例子),导致计算复杂。核函数的价值在于它虽然也是讲特征进行从低维到高维的转换,但核函数绝就绝在它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算。
5.使用松弛变量处理数据噪音
sklearn中SVM的结构,及各个参数说明如下
sklearn.svm.SVC :
C:C-SVC的惩罚参数C?默认值是1.0
C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。
kernel :核函数,默认是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
0 – 线性:u’v
1 – 多项式:(gamma*u’v + coef0)^degree
2 – RBF函数:exp(-gamma|u-v|^2)
3 –sigmoid:tanh(gammau’v + coef0)
degree :多项式poly函数的维度,默认是3,选择其他核函数时会被忽略。
gamma : ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数。默认是’auto’,则会选择1/n_features
coef0 :核函数的常数项。对于‘poly’和 ‘sigmoid’有用。
probability :是否采用概率估计?.默认为False
shrinking :是否采用shrinking heuristic方法,默认为true
tol :停止训练的误差值大小,默认为1e-3
cache_size :核函数cache缓存大小,默认为200
class_weight :类别的权重,字典形式传递。设置第几类的参数C为weightC(C-SVC中的C)
verbose :允许冗余输出?
max_iter :最大迭代次数。-1为无限制。
decision_function_shape :‘ovo’, ‘ovr’ or None, default=None3
random_state :数据洗牌时的种子值,int值
主要调节的参数有:C、kernel、degree、gamma、coef0。
三、实验环境
Python 3.9
Jupyter
四、实验内容
利用sklearn中的svm支持向量机对fetch_lfw_people数据进行人脸识别,并将预测结果可视化。
五、实验步骤
1.准备数据
1.首先需要的数据有:joblib、lfw_funneled、pairs.txt、pairsDevTest.txt、pairsDevTrain.txt
注意:也可以直接使用fetch_lfw_people这个函数是用来加载lfw人脸识别数据集的函数。
2.其次在其路径中创建一个文件
3.最后在文件里创建一个ipynb文件
SVM(Support Vector Machine)指的是支持向量机,是常见的一种判别方法。在机器学习领域,是一个有监督的学习模型,通常用来进行模式识别、分类以及回归分析。
2.业务理解
利用sklearn中的svm支持向量机做人脸识别
该数据集是在互联网上收集的著名人物的JPEG图片的集合,所有详细信息可在官方网站上获得:
http://scikit-learn.org/stable/datasets/labeled_faces.html
http://vis-www.cs.umass.edu/lfw/
每张照片都以一张脸为中心。每个通道的每个像素(RGB中的颜色)由范围为0.0-1.0的浮点编码。
该任务称为面部识别(或识别):给定面部图片,找到给定训练集(图库)的人的姓名。
3.数据理解
1.在刚才新建的ipynb文件中,编写代码,导入数据
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns;sns.set()
from matplotlib.font_manager import FontProperties
#导入fetch_lfw_people
from sklearn.datasets import fetch_lfw_people
#fetch_lfw_people函数加载人脸识别数据集
faces = fetch_lfw_people(min_faces_per_person=60)
#输出人名
print(faces.target_names)
#输出人脸数据结构
print(faces.images.shape)
说明:
fetch_lfw_people这个函数是用来加载lfw人脸识别数据集的函数,返回data,images,target,target_names.分别是向量化的人脸数据,人脸,人脸对应的人名编号,人名
关于此函数参数的描述:min_faces_per_person:提取的数据集将只保留至少具有min_faces_per_person个不同人的图片
具体数据可参考官方文档:http://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_lfw_people.html
2.绘制图形
#使用subplots 画图
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]])
plt.show()
注释: 使用subplots会返回两个东西,一个是matplotlib.figure.Figure,也就是fig,另一个是Axes object or array of Axes objects,也就是代码中的ax;把f理解为你的大图,把ax理解为包含很多小图对象的array;所以下面的代码就使用ax[0][0]这种从ax中取出实际要画图的小图对象;画出的图如下所示;
4.数据划分为测试集和训练集
1.划分训练集和测试集
from sklearn.model_selection import train_test_split
Xtrain,Xtest,ytrain,ytest=train_test_split(faces.data,faces.target,random_state=42)
Xtrain
5.模型构建
1.建立模型,计算人脸数据集上的PCA(特征脸)(处理为标记的)
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,svd_solver='randomized')
svc = SVC(kernel='rbf',class_weight='balanced')
model = make_pipeline(pca,svc)
说明:PCA主要是通过奇异值分解将数据映射到低纬度的空间(正交去相关)。PCA在数据降维,数据压缩,特征提取有很大贡献。在此,我们利用PCA提取150个主要特征,并将人脸数据全部映射到150维度,通过这150维人脸特征作为训练数据训练基于rbf kernel的SVM,模型差不多有0.85的准确率
6.参数调整
1.param_grid把参数设置成了不同的值,C:权重;gamma:多少的特征点将被使用,因为我们不知道多少特征点最好,选择了不同的组合
#参数调整
from sklearn.model_selection import GridSearchCV
param_grid = {"svc__C":[1,5,10,50],"svc__gamma":[0.0001,0.0005,0.001,0.005]}
#把所有我们所列参数的组合都放在SVC里面进行计算,最后看出哪一组函数的表现度最好
grid = GridSearchCV(model,param_grid)
%time grid.fit(Xtrain,ytrain)
print(grid.best_params_)
说明:svc__C为10svc__gamma为0.001表现度最好
7.预测测试集的人名编号
model = grid.best_estimator_
model
预测测试集:
yfit = model.predict(Xtest)
yfit
说明:结果为预测的人名编号
8.显示预测结果
1.数据可视化,把需要打印的图打印出来,预测的结果和实际结果一致,人名字体颜色为黑色,否则为红色
#显示预测结果
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=[]) #设置y轴上的标签 axi.set_ylabel(faces.target_names[yfit[i]].split()[-1],color="black" if yfit[i]==ytest[i] else "red")
fig.suptitle("Incorrect Labels in Red",size=14)
plt.show()
9.分析预测结果的准确性
使用seaborn.heatmap绘制颜色编码矩阵
解释:seaborn.heatmap()将矩形数据绘制为颜色编码矩阵。
seaborn.heatmap(data,vmin = None,vmax = None,cmap = None,center = None,robust = False,annot = None,fmt =‘。2g’,annot_kws = None,linewidths = 0,linecolor =‘white’,cbar =是的,cbar_kws =无,cbar_ax =无,square = False,xticklabels =‘auto’,yticklabels =‘auto’,mask = None,ax = None,** kwargs )
重要参数说明:
-
data:矩形数据集
-
square:布尔值,可选,如果为True,则将Axes方面设置为“相等”,以使每个单元格为方形
-
annot:bool或矩形数据集,可选,如果为True,则在每个单元格中写入数据值。如果数组具有相同的形状data,则使用此选项来注释热图而不是原始数据。
-
fmt:string,可选,添加注释时要使用的字符串格式代码。
-
cbar:布尔值,可选,是否绘制颜色条
-
xticklabels,yticklabels:“auto”,bool,list-like或int,optional。如果为True,则绘制数据框的列名称。如果为False,则不绘制列名称。如果是列表,则将这些替代标签绘制为xticklabels。如果是整数,则使用列名称,但仅绘制每个n标签。如果是“自动”,请尝试密集绘制不重叠的标签
#分析预测结果的准确性
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.rcParams["font.family"]="SimHei"
plt.xlabel("真实值")
plt.ylabel("预测值")
plt.show()
10.完整代码
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns;sns.set()
from matplotlib.font_manager import FontProperties
#导入fetch_lfw_people
from sklearn.datasets import fetch_lfw_people
#fetch_lfw_people函数加载人脸识别数据集
faces = fetch_lfw_people(min_faces_per_person=60)
#输出人名
print(faces.target_names)
#输出人脸数据结构
print(faces.images.shape)#使用subplots 画图
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]])
plt.show()#划分训练集和测试集
from sklearn.model_selection import train_test_split
Xtrain,Xtest,ytrain,ytest=train_test_split(faces.data,faces.target,random_state=42)
Xtrain #建模
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
#计算人脸数据集上的PCA(特征脸)(处理为未标记的)
pca = PCA(n_components=150,whiten=True,random_state=42,svd_solver='randomized')
svc = SVC(kernel='rbf',class_weight='balanced')
model = make_pipeline(pca,svc) #参数调整
from sklearn.model_selection import GridSearchCV
param_grid = {"svc__C":[1,5,10,50],"svc__gamma":[0.0001,0.0005,0.001,0.005]}
#把所有我们所列参数的组合都放在SVC里面进行计算,最后看出哪一组函数的表现度最好
grid = GridSearchCV(model,param_grid)
%time grid.fit(Xtrain,ytrain)
print(grid.best_params_) model = grid.best_estimator_
model
yfit = model.predict(Xtest)
yfit #显示预测结果
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=[]) #设置y轴上的标签 axi.set_ylabel(faces.target_names[yfit[i]].split()[-1],color="black" if yfit[i]==ytest[i] else "red")
fig.suptitle("Incorrect Labels in Red",size=14)
plt.show() #分析预测结果的准确性
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.rcParams["font.family"]="SimHei"
plt.xlabel("真实值")
plt.ylabel("预测值")
plt.show()
总结
逻辑回归可以分为线性与非线性,也可以根据类的个数分为二分类与多分类问题,使用时需要灵活应用,能够构造损失函数并求梯度,同时能够用算法实现并进行训练预测。
事实上,细心的同学会发现,在逻辑回归中,我们发现是多个输入(即p个指标),最终输出一个结果(0或1),处理过程是输入乘上权重w加偏置b,再对结果用sigmoid 函数处理,这个过程其实很接近于神经网络了,而逻辑回归的模型更接近于感知机。对于神经网络,它不只有输入和输出两层,而且增加了更多的隐藏层,每一层的处理结果都作为下一层的输入,那么它的损失函数与梯度的求解也将更加复杂,模型也复杂许多。
相关文章:

机器学习:基于支持向量机(SVM)进行人脸识别预测
机器学习:基于支持向量机(SVM)进行人脸识别预测 文章目录机器学习:基于支持向量机(SVM)进行人脸识别预测一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.准备数据2.业务理解3.数据理解4.数…...

【服务器数据恢复】多块磁盘离线导致RAIDZ崩溃的数据恢复案例
服务器数据恢复环境: SUN ZFS系列某型号存储阵列; 40块磁盘组建的存储池(其中4块磁盘用作全局热备盘),池内划分出若干空间映射到服务器使用; 服务器使用Windows操作系统。 服务器故障: 服务器在…...

iconfont 图标如何在uniapp中的tabBar使用
注意: 小程序并不支持tabBar中 设置 iconfont 1. 材料准备 首先进入字体图标网址:iconfont-阿里巴巴矢量图标库;(如果你没有登入,记得登入一下) 把图标添加入购物车 添加到购物车之后-(右上角…...

第六章.卷积神经网络(CNN)—卷积层(Convolution)池化层(Pooling)
第六章.卷积神经网络(CNN) 6.1 卷积层(Convolution)&池化层(Pooling) 1.整体结构 以5层神经网络的实现为例: 1).基于全连接层(Affine)的网络 全连接层:相邻层的所有神经元之间都有连接 2).常见的CNN的网络 3).全连接层存在的问题 数据的形状容易被…...

c/c++开发,无可避免的模板编程实践(篇六)
一、泛型算法 1.1 泛型算法概述 c标准库不仅包含数据结构(容器、容器适配器等),还有很多算法。数据结构可以帮助存放特定情况下需要保存的数据,而算法则会将数据结构中存储的数据进行变换。标准库没有给容器添加大量的功能函数&am…...

【Java】Spring核心与设计思想
文章目录Spring核心与设计思想1. Spring是什么1.1 什么是容器1.2 什么是IOC1.2.1 传统程序开发1.2.2 控制反转式程序开发1.2.3 对比总结规律1.3 理解Spring IOC1.4 DI概念说明Spring核心与设计思想 1. Spring是什么 我们通常所说的Spring指的是Spring Framework(S…...

组合实现多类别分割(含实战代码)
来源:投稿 作者:AI浩 编辑:学姐 摘要 segmentation_models_pytorch是一款非常优秀的图像分割库,albumentations是一款非常优秀的图像增强库,这篇文章将这两款优秀结合起来实现多类别的图像分割算法。数据集选用CamVid…...

从红队视角看AWD攻击
AWD的权限维持 攻防兼备AWD模式是一种综合考核参赛团队攻击、防御技术能力、即时策略的比赛模式。在攻防模式中,参赛队伍分别防守同样配置的虚拟靶机,并在有限的博弈时间内,找到其他战队的薄弱环节进行攻击,同时要对自己的靶机环…...

龙腾万里,福至万家——“北京龙文化促进协会第九届龙抬头传承会”在京举办
2023年2月21日(农历2月初二)上午9:00点至下午13:00,由北京龙文化促进协会主办、传世经典(北京)文化发展有限公司承办、北京华夏龙文旅联盟协办的“北京龙文化促进协会第九届二月二龙抬头传承会”在北京市丰台区顺和国际大厦A口6层会议厅隆重召开。 传承会活动内容主…...
《软件方法》强化自测题-业务建模(4)
按照业务建模、需求、分析、设计工作流考察,答案不直接给出,可访问自测链接或扫二维码自测,做到全对才能知道答案。 知识点见《软件方法》(http://www.umlchina.com/book/softmeth.html)、 “软件需求设计方法学全程…...

Prometheus之pushgateway
Pushgateway简介 Pushgateway是Prometheus监控系统中的一个重要组件,它采用被动push的方式获取数据,由应用主动将数据推送到pushgateway,然后Prometheus再从Pushgateway抓取数据。使用Pushgateway的主要原因是: Prometheus和targ…...

3分钟带您快速了解HIL测试及其架构
什么是HIL测试硬件在环(HIL)仿真是一种用于测试导航系统的技术,其中测试前并不知道车辆轨迹。在这种情况下,车辆轨迹被实时馈送到GNSS模拟器。HIL可用于复杂实时系统的开发和测试,如卫星控制系统、军事战术导弹、飞机飞…...

华为认证含金量如何?
一本证书是否有用,还要看它是否被市场所认可。 我们说华为认证HCIP有用,很大一部分还取决于它极高的适用性和权威性。华为是国内最大的生产销售通信设备的民营通信科技公司。 自2013年起,国家对网络安全极度重视,相继把国外的网…...
刷题记录:牛客NC54586小翔和泰拉瑞亚
传送门:牛客 题目描述: 小翔爱玩泰拉瑞亚 。 一天,他碰到了一幅地图。这幅地图可以分为n列,第i列的高度为Hi,他认为这个地图不好看,决定对它进行改造。 小翔又学会了m个魔法,实施第i个魔法可以使地图的第Li列到第Ri列…...

面试个3年自动化测试,测试水平一言难尽。。。。
公司前段缺人,也面了不少测试,结果竟然没有一个合适的。 一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在10-20k,面试的人很多,但平均水平很让人失望。 看简历很多都是3年工作经验,但…...

C++面向对象(下)
文章目录前言1.再谈构造函数1.初始化列表2.explicit关键字2. static成员1.概念3.友元1.概念2.友元函数3.友元类4. 内部类5.匿名对象6.编译器优化7.总结前言 本文是主要是将之前关于C面向对象中的一些没有归纳到的零星知识点进行补充,同时对C中的面向对象简单收个尾…...

面试一位软件测试6年工作者:一年经验掰成六年来用....
在众多面试中,对于那个工作了6年的面试者,我印象很深刻,因为最开始拿到简历的时候,我一摸:"这简历,好厚啊!"再一看,工作6年。 于是我去找了我的领导,我说:“这人我应该没…...
Java8 新特性--Optional
Optional是什么 java.util.Optional Jdk8提供Optional,一个可以包含null值的容器对象,可以用来代替xx ! null的判断。 Optional常用方法 of public static <T> Optional<T> of(T value) {return new Optional<>(value); }为value…...

Pytorch GPU版本简明下载安装教程
1.根据自己的显卡型号下载显卡驱动并安装。这一步会更新你的显卡驱动,也可忽略第1步,如果第2步出现问题,返回执行第1步。 点击这里下载英伟达显卡驱动 2.安装完成后,wincmd打开命令行,输入nvidia-smi,查看…...

【C++】map和set的封装
文章目录一、前情回顾二、简化源码三、仿函数四、迭代器五、set的实现六、map的实现七、红黑树代码一、前情回顾 set 参数只有 key,但是map除了key还有value。我们还是需要KV模型的红黑树的: #pragma once #include <iostream> #include <ass…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...