机器学习:基于支持向量机(SVM)进行人脸识别预测

news2024/12/22 16:53:49

机器学习:基于支持向量机(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(gamma
u’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为weight
C(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 函数处理,这个过程其实很接近于神经网络了,而逻辑回归的模型更接近于感知机。对于神经网络,它不只有输入和输出两层,而且增加了更多的隐藏层,每一层的处理结果都作为下一层的输入,那么它的损失函数与梯度的求解也将更加复杂,模型也复杂许多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358478.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java3月train笔记

java笔记 day01 一、jdk和idea下载及安装(一般不建议装C盘): jdk:java开发环境 idea:开发工具(软件),用来编写代码的 苍老师文档服务器:doc.canglaoshi.org jdk下载&…

JavaEE|网络编程之套接字 TCP

文章目录一、ServerSocket API构造方法常用方法二、Socket API构造方法常用方法注意事项三、TCP中的长短连接E1:一发一收(短连接)E2:请求响应(短连接)E3:多线程下的TCP回响服务器说明:这部分说实话有点懵&a…

SrpingBoot拦截器

一、拦截器原理 根据当前请求,进入到 HandlerExecutionChain(可以处理请求的 handler 以及 handler 的所有拦截器)根据顺序执行所有拦截器的 preHandle() 方法如果当前拦截器的 preHandler() 方法返回 true,则执行下一个拦截器的 preHandler() 方法如果当…

Java常用框架(一)

思维导图 常见知识点 一、SpringBoot 1.简单介绍一下Spring及其优缺点 1.1 概念 重量级企业开发框架EJB的替代品,通过依赖注入、面向切面编程,使用简单Java对象POJO为企业Java开发提供了相对简单的方法。 1.2 优缺点 1.2.1 优点 组件代码轻量级 …

高并发架构 第一章大型网站数据演化——核心解释与说明。大型网站技术架构——核心原理与案例分析

大型网站架构烟花发展历程1.1.1初始阶段的网站构架1.1.2应用服务和数据服务分离1.1.3使用缓存改善网络性能1.1.4使用应用服务器集群改善网站的并发处理能力1.1.5数据库读写分离1.1.6使用反向代理和cdn加速网站相应1.1.1初始阶段的网站构架 大型网站都是由小型网站一步步发展而…

音视频基础之音频常见名词

采样频率 每秒钟采样的点的个数。常用的采样频率有: 22000(22kHz): 无线广播。 44100(44.1kHz):CD音质。 48000(48kHz): 数字电视,DVD。 96000&am…

【C++提高编程】C++全栈体系(二十二)

C提高编程 第三章 STL - 常用容器 五、stack容器 1. stack 基本概念 概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口 栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为 栈中进入数据称为 — 入…

startForegroundService与startService 使用浅析

一. 了解服务(Service)的概念 service是安卓开发中一个很重要组件,意为“服务”。与我们常见的activity不同,“服务”是默默的在背后进行工作的,通常,它用于在后台为我们执行一些耗时,或者需要…

【机器学习】Adaboost

1.什么是Adaboost AdaBoost(adapt boost),自适应推进算法,属于Boosting方法的学习机制。是一种通过改变训练样本权重来学习多个弱分类器并进行线性结合的过程。它的自适应在于:被前一个基本分类器误分类的样本的权值会…

二叉树最大深度、最小深度、以及n叉树的最大深度

1.N 叉树的最大深度 给定一个 N 叉树,找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。 示例 1: 输入&#xff…

多因子模型(MFM)

多因子模型(Muiti-Factor M: MFM)因子投资基础CAPM (资本资产定价模型)APT套利定价理论截面数据 & 时间序列数据 & 面板数据定价误差 α\alphaαalpha 出现的原因线性多因子模型Fama-French三因子模型三因子的计算公式利用alpha大小进行购买股票…

centos误删python2后怎么重新安装

此教程为离线安装 一. 先查询系统版本 cat /proc/version Linux version 3.10.0-1127.el7.x86_64 (mockbuildkbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) ) #1 SMP Tue Mar 31 23:36:51 UTC 2020 二. 安装python2.7.5(已知原python版…

【C++修炼之路】19.AVL树

每一个不曾起舞的日子都是对生命的辜负 AVL树前言:一.AVL树的概念二.AVL树的结构2.1 AVL树节点的定义2.2 AVL树的结构2.3 AVL树的插入2.4 AVL树的验证2.5 AVL树的删除(了解)三.AVL树的旋转(重要)3.1 左单旋3.2 右单旋3.3 左右双旋3.4 右左双旋…

2023年 ChatGPT 研究报告

第一章 行业概况 ChatGPT是由OpenAI 团队研发创造,OpenAI是由创业家埃隆马斯克、美国创业孵化器Y Combinator总裁阿尔特曼、全球在线支付平台PayPal联合创始人彼得蒂尔等人于2015年在旧金山创立的一家非盈利的AI研究公司,拥有多位硅谷重量级人物的资金支…

最简单得方法解决TCP分包粘包问题

如何用最简单的方法解决TCP传输中的分包粘包问题? 首先需要说明一点,分包粘包等等一系列的问题并不是协议本身存在的问题,而是程序员在写代码的时候,没有搞清楚数据的边界导致的。 看个简单的例子,TCP客户端不断的向服…

SAP 解析固定资产的减值功能

SAP固定资产的减值功能 若固定资产出现减值迹象,也就是固定资产的可收回金额小于账面价值时,就要计提固定资产减值准备。 分录: 借:资产减值损失(损益科目) 贷:固定资产减值准备(资…

骨传导耳机是不是智商税?骨传导耳机真的不伤耳吗?

很多人对骨传导耳机是具有一定的了解,但是对骨传导耳机还是有一定的刻板印象,那么骨传导耳机到底是不是智商税呢?主要还是要从骨传导耳机传声原理上讨论。 骨传导耳机是属于固体传声的一种方式,通过骨骼传递声音,在使用…

一种基于强化学习的自动变道机动方法

文章目录摘要前言相关的工作方法论动作空间奖励函数设计Q学习仿真结果结论摘要 变道是一项至关重要的车辆操作,需要与周围车辆协调。建立在基于规则的模型上的自动换道功能可能在预定义的操作条件下表现良好,但在遇到意外情况时可能容易失败。在我们的研…

谈一谈正向代理和反向代理?

谈一谈正向代理和反向代理?什么是代理服务器(Proxy Serve)?为什么使用代理服务器?什么是正向代理什么是反向代理正向代理和反向代理的区别正向代理的应用反向代理的应用什么是代理服务器(Proxy Serve&#…

android kotlin 协程(四) 协程间的通信

android kotlin 协程(四) 协程间的通信 学完本篇你将会了解到: channelproduceactorselect 先来通过上一篇的简单案例回顾一下挂起于恢复: fun main() {val waitTime measureTimeMillis {runBlocking<Unit> {println("main start") // 1 // …