阿里云网站建设方案书填写,wordpress商城主题付费,洛阳网络公司排名,网站建设asp文件怎么展现机器学习#xff1a;基于支持向量机#xff08;SVM#xff09;进行人脸识别预测 文章目录机器学习#xff1a;基于支持向量机#xff08;SVM#xff09;进行人脸识别预测一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤1.准备数据2.业务理解3.数据理解4.数…机器学习基于支持向量机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 CC-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 –sigmoidtanh(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, defaultNone3 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_person60)
#输出人名
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],cmapbone) axi.set(xticks[],yticks[],xlabelfaces.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,ytesttrain_test_split(faces.data,faces.target,random_state42)
Xtrain 5.模型构建
1.建立模型计算人脸数据集上的PCA特征脸处理为标记的
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline pca PCA(n_components150,whitenTrue,random_state42,svd_solverrandomized)
svc SVC(kernelrbf,class_weightbalanced)
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),cmapbone) axi.set(xticks[],yticks[]) #设置y轴上的标签 axi.set_ylabel(faces.target_names[yfit[i]].split()[-1],colorblack if yfit[i]ytest[i] else red)
fig.suptitle(Incorrect Labels in Red,size14)
plt.show() 9.分析预测结果的准确性
使用seaborn.heatmap绘制颜色编码矩阵
解释seaborn.heatmap()将矩形数据绘制为颜色编码矩阵。
seaborn.heatmapdatavmin Nonevmax Nonecmap Nonecenter Nonerobust Falseannot Nonefmt ‘。2g’annot_kws Nonelinewidths 0linecolor ‘white’cbar 是的cbar_kws 无cbar_ax 无square Falsexticklabels ‘auto’yticklabels ‘auto’mask Noneax None** kwargs
重要参数说明 data矩形数据集 square布尔值可选如果为True则将Axes方面设置为“相等”以使每个单元格为方形 annotbool或矩形数据集可选如果为True则在每个单元格中写入数据值。如果数组具有相同的形状data则使用此选项来注释热图而不是原始数据。 fmtstring可选添加注释时要使用的字符串格式代码。 cbar布尔值可选是否绘制颜色条 xticklabelsyticklabels“auto”boollist-like或intoptional。如果为True则绘制数据框的列名称。如果为False则不绘制列名称。如果是列表则将这些替代标签绘制为xticklabels。如果是整数则使用列名称但仅绘制每个n标签。如果是“自动”请尝试密集绘制不重叠的标签
#分析预测结果的准确性
from sklearn.metrics import confusion_matrix
#混淆矩阵
mat confusion_matrix(ytest,yfit)
#绘制热图
sns.heatmap(mat.T,squareTrue,annotTrue,fmtd,cbarFalse,xticklabelsfaces.target_names,yticklabelsfaces.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_person60)
#输出人名
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],cmapbone) axi.set(xticks[],yticks[],xlabelfaces.target_names[faces.target[i]])
plt.show()#划分训练集和测试集
from sklearn.model_selection import train_test_split
Xtrain,Xtest,ytrain,ytesttrain_test_split(faces.data,faces.target,random_state42)
Xtrain #建模
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline
#计算人脸数据集上的PCA(特征脸)(处理为未标记的)
pca PCA(n_components150,whitenTrue,random_state42,svd_solverrandomized)
svc SVC(kernelrbf,class_weightbalanced)
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),cmapbone) axi.set(xticks[],yticks[]) #设置y轴上的标签 axi.set_ylabel(faces.target_names[yfit[i]].split()[-1],colorblack if yfit[i]ytest[i] else red)
fig.suptitle(Incorrect Labels in Red,size14)
plt.show() #分析预测结果的准确性
from sklearn.metrics import confusion_matrix
#混淆矩阵
mat confusion_matrix(ytest,yfit)
#绘制热图
sns.heatmap(mat.T,squareTrue,annotTrue,fmtd,cbarFalse,xticklabelsfaces.target_names,yticklabelsfaces.target_names)
plt.rcParams[font.family]SimHei
plt.xlabel(真实值)
plt.ylabel(预测值)
plt.show() 总结
逻辑回归可以分为线性与非线性也可以根据类的个数分为二分类与多分类问题使用时需要灵活应用能够构造损失函数并求梯度同时能够用算法实现并进行训练预测。
事实上细心的同学会发现在逻辑回归中我们发现是多个输入即p个指标最终输出一个结果0或1处理过程是输入乘上权重w加偏置b再对结果用sigmoid 函数处理这个过程其实很接近于神经网络了而逻辑回归的模型更接近于感知机。对于神经网络它不只有输入和输出两层而且增加了更多的隐藏层每一层的处理结果都作为下一层的输入那么它的损失函数与梯度的求解也将更加复杂模型也复杂许多。