人工智能学习笔记 实验五 python 实现 SVM 分类器的设计与应用

article/2025/10/6 11:51:49

学习来源

【机器学习】基于SVM人脸识别算法的一些对比探究(先降维好还是先标准化好等对比分析)_○( ^皿^)っHiahiahia…的博客-CSDN博客

实验原理

有关svm原理 请移步该篇通俗易懂的博客 机器学习算法(一)SVM_yaoyz105-CSDN博客_svm

下图 或许可以简单概括svm功能与原理

  有关深究svm原理 请移步该篇通俗易懂的博客 机器学习算法(一)SVM_yaoyz105-CSDN博客_svm

或者评论我获取svm学习ppt

实验内容

1. 数据库的选择
可选取 ORL 人脸数据库作为实验样本,总共 40 个人,每人 10 幅图像,图像大小为
112*92 像素。图像本身已经经过处理,不需要进行归一化和校准等工作。实验样本分为训
练样本和测试样本。首先设置训练样本集,选择 40 个人前 5 张图片作为训练样本,进行训
练。然后设置测试样本集,将 40 个人后 5 张图片作为测试样本,进行选取识别。
2. 实验基本步骤
人脸识别算法步骤概述:
a) 读取训练数据集;
flag=0 ,表述读取原文件的前五幅图作为训练数据,若 flag=1 ,表述读取原文件
的后五幅图作为测试数据,数据存入 f_matrix 中,每一行为一个文件,每行为 112*92
列。参见: ReadFace.m
b) 主成分分析法降维并去除数据之间的相关性;参见: fastPCA.m
c) 数据规格化;参见 scaling.m
d) SVM 训练(选取径向基和函数)得到分类函数;参见: multiSVMtrain.m
e) 读取测试数据、降维、规格化;参见: multiSVM.m
f) 用步骤 d 产生的分类函数进行分类(多分类问题,采用一对一投票策略,归位得票
最多的一类);参见: main.m
g) 计算正确率。
以上只是matlib做法
而我会使用python做法
3. 实验要求
1 ) 分别使用 PCA 降维到 20,50,100,200 ,然后训练分类器,对比分类结果,画出对比曲 线;
2 ) 变换 SVM kernel 函数,如分别使用径向基函数和多项式核函数训练分类器,对
比分类结果,画出对比曲线;
3 ) 使用交叉验证方法,变换训练集及测试集,分析分类结果。

实验步骤

一、分别使用 PCA 降维到 20,50,100,200,然后训练分类器,对比分类结果,画出对比曲线;

1.数据处理

def get_data(x,y):file_path='./ORL/' #设置文件路径(这里为当前目录下的ORL文件夹)train_set = np.zeros(shape=[1,112*92])  #train_set用于获取的数据集train_set = pd.DataFrame(train_set)     #将train_set转换成DataFrame类型target=[]                               #标签列表for i in range(1,41):                   #i用于遍历ORL文件夹中的40个文件夹         for j in range(x,y):                #j用于遍历每个文件夹的对应的x到y-1的图片target.append(i)                #读入标签(图片文件夹中的人脸是同一个人的)img = cv2.imread(file_path+'s'+str(i)+'/'+str(j)+'.bmp',\cv2.IMREAD_GRAYSCALE) #读取图片,第二个参数表示以灰度图像读入img=img.reshape(1,img.shape[0]*img.shape[1]) #将读入的图片数据转换成一维img=pd.DataFrame(img)           #将一维的图片数据转成DataFrame类型train_set=pd.concat([train_set,img],axis=0)#按行拼接DataFrame矩阵train_set.index=list(range(0,train_set.shape[0])) #设置 train_set的行索引train_set.drop(labels=0,axis=0,inplace=True) #删除行索引为0的行(删除第一行)target=pd.DataFrame(target)             #将标签列表转成DataFrame类型return train_set,target                 #返回数据集和标签

2.数据标准化+PCA降维+自动

def face_fuc1(face_data_train,face_target_train,face_data_test,face_target_test):#2、数据标准化 标准差标准化stdScaler = StandardScaler().fit(face_data_train) face_trainStd = stdScaler.transform(face_data_train)face_testStd = stdScaler.transform(face_data_test)#dimension=[3,5,10,20,50,100,200]dimension=[20,50,100,200]'''dimension=[]for i in range(1,40):dimension.append(i*5)'''accuracy=[]for i in dimension:#3、PCA降维pca = PCA(n_components=i).fit(face_trainStd) face_trainPca = pca.transform(face_trainStd) face_testPca = pca.transform(face_testStd)#4、建立SVM模型  默认为径向基核函数kernel='rbf' 多项式核函数kernel='poly'#svm = SVC().fit(face_trainPca,face_target_train)svm = SVC(kernel='poly').fit(face_trainPca,face_target_train)#5、预测训练集结果face_target_pred = svm.predict(face_testPca)#6、分析预测结果true=0for i in range(0,200):if face_target_pred[i] == face_target_test[i]:true+=1accuracy.append(true/face_target_test.shape[0])        print(accuracy)plt.plot(dimension,accuracy,"b-")plt.legend(['默认径向基核函数kernel=\'rbf\'','多项式核函数kernel=\'poly\''])plt.show()#draw_chart1(dimension,accuracy)

3.总代码

import cv2 #opencv库,用于读取图片等操作
import numpy as np 
import pandas as pd  
from sklearn.preprocessing import StandardScaler #标准差标准化
from sklearn.svm import SVC                      #svm包中SVC用于分类
from sklearn.decomposition import PCA            #特征分解模块的PCA用于降维       
import matplotlib.pyplot as plt                  #用于绘制图形 def get_data(x,y):file_path='./ORL/' #设置文件路径(这里为当前目录下的ORL文件夹)train_set = np.zeros(shape=[1,112*92])  #train_set用于获取的数据集train_set = pd.DataFrame(train_set)     #将train_set转换成DataFrame类型target=[]                               #标签列表for i in range(1,41):                   #i用于遍历ORL文件夹中的40个文件夹         for j in range(x,y):                #j用于遍历每个文件夹的对应的x到y-1的图片target.append(i)                #读入标签(图片文件夹中的人脸是同一个人的)img = cv2.imread(file_path+'s'+str(i)+'/'+str(j)+'.bmp',\cv2.IMREAD_GRAYSCALE) #读取图片,第二个参数表示以灰度图像读入img=img.reshape(1,img.shape[0]*img.shape[1]) #将读入的图片数据转换成一维img=pd.DataFrame(img)           #将一维的图片数据转成DataFrame类型train_set=pd.concat([train_set,img],axis=0)#按行拼接DataFrame矩阵train_set.index=list(range(0,train_set.shape[0])) #设置 train_set的行索引train_set.drop(labels=0,axis=0,inplace=True) #删除行索引为0的行(删除第一行)target=pd.DataFrame(target)             #将标签列表转成DataFrame类型return train_set,target                 #返回数据集和标签def draw_chart(dimension,accuracy):plt.rcParams['font.sans-serif']='SimHei'plt.figure(figsize=(6,6))plt.plot(dimension,accuracy,"r-")plt.xlabel('PCA降维的维度')plt.ylabel('人脸识别准确率')plt.title('linear不同维度差异')#plt.savefig("./tmp/采用默认径向基核函数kernel=\'rbf\' 先降维后标准化.png")plt.show()def draw_chart1(dimension,accuracy):plt.rcParams['font.sans-serif']='SimHei'plt.figure(figsize=(6,6))plt.plot(dimension,accuracy,"r-")plt.xlabel('PCA降维的维度')plt.ylabel('人脸识别准确率')plt.title('poly不同维度差异')#plt.savefig("./tmp/采用默认径向基核函数kernel=\'rbf\' 先降维后标准化.png")plt.show()def face_fuc(face_data_train,face_target_train,face_data_test,face_target_test):#2、数据标准化 标准差标准化stdScaler = StandardScaler().fit(face_data_train) face_trainStd = stdScaler.transform(face_data_train)face_testStd = stdScaler.transform(face_data_test)#dimension=[3,5,10,20,50,100,200]dimension=[20,50,100,200]'''dimension=[]for i in range(1,40):dimension.append(i*5)'''accuracy=[]for i in dimension:#3、PCA降维pca = PCA(n_components=i).fit(face_trainStd) face_trainPca = pca.transform(face_trainStd) face_testPca = pca.transform(face_testStd)#4、建立SVM模型  默认为径向基核函数kernel='rbf' 多项式核函数kernel='poly'svm = SVC(kernel='linear').fit(face_trainPca,face_target_train)#svm = SVC(kernel='poly').fit(face_trainPca,face_target_train)#5、预测训练集结果face_target_pred = svm.predict(face_testPca)#6、分析预测结果true=0for i in range(0,200):if face_target_pred[i] == face_target_test[i]:true+=1accuracy.append(true/face_target_test.shape[0])        print(accuracy)draw_chart(dimension,accuracy)def face_fuc1(face_data_train,face_target_train,face_data_test,face_target_test):#2、数据标准化 标准差标准化stdScaler = StandardScaler().fit(face_data_train) face_trainStd = stdScaler.transform(face_data_train)face_testStd = stdScaler.transform(face_data_test)#dimension=[3,5,10,20,50,100,200]dimension=[20,50,100,200]'''dimension=[]for i in range(1,40):dimension.append(i*5)'''accuracy=[]for i in dimension:#3、PCA降维pca = PCA(n_components=i).fit(face_trainStd) face_trainPca = pca.transform(face_trainStd) face_testPca = pca.transform(face_testStd)#4、建立SVM模型  默认为径向基核函数kernel='rbf' 多项式核函数kernel='poly'#svm = SVC().fit(face_trainPca,face_target_train)svm = SVC(kernel='poly').fit(face_trainPca,face_target_train)#5、预测训练集结果face_target_pred = svm.predict(face_testPca)#6、分析预测结果true=0for i in range(0,200):if face_target_pred[i] == face_target_test[i]:true+=1accuracy.append(true/face_target_test.shape[0])        print(accuracy)plt.plot(dimension,accuracy,"b-")plt.legend(['默认径向基核函数kernel=\'rbf\'','多项式核函数kernel=\'poly\''])plt.show()#draw_chart1(dimension,accuracy)if __name__ == '__main__':#1、获取数据face_data_train,face_target_train=get_data(1,6) #读取前五张图片为训练集face_data_test,face_target_test=get_data(6,11)  #读取后五张图片为测试集face_target_test=face_target_test.values #将DataFrame类型转成ndarrayl类型# face_fuc(face_data_train,face_target_train,face_data_test,face_target_test)face_fuc1(face_data_train,face_target_train,face_data_test,face_target_test)

4.处理结果

 

二、 变换 SVM kernel 函数,如分别使用径向基函数和多项式核函数训练分类器,对比分类结果,画出对比曲线。对比四个核函数在不同降维情况下的准确度(采用交叉验证)

有关交叉验证用法来自此处

1.降维 选核函数 交叉验证 绘制图像

def face_fuc(face_data_train,face_target_train,k,c):stdScaler = StandardScaler().fit(face_data_train) face_trainStd = stdScaler.transform(face_data_train)dimension=[3,5,10,20,50,100,200]accuracy=[]for i in dimension:pca = PCA(n_components=i).fit(face_trainStd) face_trainPca = pca.transform(face_trainStd) #默认为径向基核函数kernel='rbf' 多项式核函数'poly'  线性核函数'linear'  sigmoid核函数svm = SVC(kernel=k)scores = cross_val_score(svm,face_trainPca,face_target_train,cv=3)print(scores)accuracy.append(scores.mean())print(accuracy)plt.plot(dimension,accuracy,c)

 2.总函数

import cv2 #opencv库,用于读取图片等操作
import numpy as np 
import pandas as pd  
from sklearn.preprocessing import StandardScaler    #标准差标准化
from sklearn.model_selection import cross_val_score #用于交叉验证
from sklearn.svm import SVC                         #svm包中SVC用于分类
from sklearn.decomposition import PCA               #特征分解模块的PCA用于降维       
import matplotlib.pyplot as plt                     #用于绘制图形 def get_data(x,y):file_path='./ORL/' #设置文件路径(这里为当前目录下的ORL文件夹)train_set = np.zeros(shape=[1,112*92])  #train_set用于获取的数据集train_set = pd.DataFrame(train_set)     #将train_set转换成DataFrame类型target=[]                               #标签列表for i in range(1,41):                   #i用于遍历ORL文件夹中的40个文件夹         for j in range(x,y):                #j用于遍历每个文件夹的对应的x到y-1的图片target.append(i)                #读入标签(图片文件夹中的人脸是同一个人的)img = cv2.imread(file_path+'s'+str(i)+'/'+str(j)+'.bmp',\cv2.IMREAD_GRAYSCALE) #读取图片,第二个参数表示以灰度图像读入img=img.reshape(1,img.shape[0]*img.shape[1]) #将读入的图片数据转换成一维img=pd.DataFrame(img)           #将一维的图片数据转成DataFrame类型train_set=pd.concat([train_set,img],axis=0)#按行拼接DataFrame矩阵train_set.index=list(range(0,train_set.shape[0])) #设置 train_set的行索引train_set.drop(labels=0,axis=0,inplace=True) #删除行索引为0的行(删除第一行)target=pd.DataFrame(target)             #将标签列表转成DataFrame类型return train_set,target                 #返回数据集和标签def face_fuc(face_data_train,face_target_train,k,c):stdScaler = StandardScaler().fit(face_data_train) face_trainStd = stdScaler.transform(face_data_train)dimension=[3,5,10,20,50,100,200]#dimension=[20,50,100,200]'''dimension=[]for i in range(1,40):dimension.append(i*5)'''accuracy=[]for i in dimension:pca = PCA(n_components=i).fit(face_trainStd) face_trainPca = pca.transform(face_trainStd) #默认为径向基核函数kernel='rbf' 多项式核函数'poly'  线性核函数'linear'  sigmoid核函数svm = SVC(kernel=k)scores = cross_val_score(svm,face_trainPca,face_target_train,cv=3)print(scores)accuracy.append(scores.mean())print(accuracy)plt.plot(dimension,accuracy,c)if __name__ == '__main__':face_data_train,face_target_train=get_data(1,11) #读取所有图片kernel= [ 'poly','linear', 'rbf', 'sigmoid' ]color=['r','y','b','g']plt.rcParams['font.sans-serif']='SimHei'plt.figure(figsize=(6,6))plt.xlabel('PCA降维的维度')plt.ylabel('人脸识别准确率')plt.title('对比不同核函数训练结果准确性的差异 ')for i in range(0,4):face_fuc(face_data_train,face_target_train,kernel[i],color[i])plt.legend(['poly','linear', 'rbf', 'sigmoid'])plt.show()

3.实现结果


http://chatgpt.dhexx.cn/article/ZQ3A7GDl.shtml

相关文章

Matlab-SVM分类器

支持向量机(Support Vector Machine,SVM),可以完成对数据的分类,包括线性可分情况和线性不可分情况。 1、线性可分 首先,对于SVM来说,它用于二分类问题,也就是通过寻找一个分类线(二维是直线&…

UGUI——RectTransform详解

什么是RectTransform 创建一个UGUI控件时,查看其Inspector面板,原先熟悉的Transform已经被替换成RectTransform,面板也与原先的Transform的面板相去甚远。 先看看Unity官方对RectTransform的描述: Position, size, anchor and pi…

【Unity3D】UGUI之Button

1 Button属性面板 在 Hierarchy 窗口右键,选择 UI 列表里的 Button 控件,即可创建 Button 控件,选中创建的 Button 控件,按键盘【T】键,可以调整 Button 控件的大小和位置。创建 Button 控件时,系统会自动给…

UGUI基础

UGUI基础 ##1、UGUI概述 1.1、Unity界面发展史 【老版本界面onGUI】>【GUI插件NGUI】>【新版本界面UGUI】 1.2、UGUI特点 新的UI系统是从Unity4.6开始被集成到Unity编译器中的。Unity官方给这个新的UI系统赋予的标签是:灵活,快速和可视化。 对…

【Unity基础】ugui的案例篇(个人学习)

文章目录 前言案例1、点击游戏物体改变一次颜色,被UI遮挡的情况下点击无效1.动态图演示2.实现方式I.实现方案1 通过射线检测实现 3.源码演示Lua部分代码CSharp部分代码 案例2、圆形图片的制作1.图演示2.实现方式I.实现方案1 使用Mask组件实现II.实现方案2 通过重写G…

Unity UGUI源码解析

前言 这篇文章想写的目的也是因为我面试遇到了面试官问我关于UGUI原理性的问题,虽然我看过,但是并没有整理出完整的知识框架,导致描述的时候可能自己都是不清不楚的。自己说不清楚的东西,别人就等于你不会。每当学完一个东西的时…

UGUI基础学习

目录 TEXT IMAGE ROWIMAGE TEXT fontsize:字体 color:字体颜色 ;inespacing:字行间隔 代码展示: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class TEXTtest : MonoBehaviour {p…

UGUI源码解析——总览

一:图像相关 ——UIBehaviour:UI组件的基类,继承MonoBehaviourUGUI源码解析——UIBehaviour——CanvasUpdateRegistry:图像、布局重建注册器UGUI源码解析——CanvasUpdateRegistry——ICanvasElement:图像、布局重建接…

UGUI 全方位了解

随着 unity3d 4.6 ~ 5.x 新 UI 系统终于与大家见面了。这篇文章将不会介绍如何使用按钮、滚动条之类的UI控件,这些内容可以参考 Unity Manual;这篇文章的重点是,如何理解 UI 系统的设计,以便更好的在实际中使用它。 RectTransfor…

UI框架(UGUI)

整个游戏的工程源码下载链接:点击打开链接 可以参考的写的Demo和本文章来学习 毕竟有些细节问题在文章中不能一一说到 工具:VS2010、Unity5.2.3f 先介绍整个Demo的主面板 其中任务、技能、符文等等都是按钮,点击按钮会生成相应面板 【Pro…

UGUI相关使用

UGUI 文章目录 UGUI1.六大基础组件概述1.1 Canvas组件1.2 CanvasScaler组件1.3 Graphic Raycaster组件1.4 Event System组件1.5 Standalone Input Module组件1.6 RectTransform组件 2.三大基础控件概述2.1 图像控件Image2.2 文本控件Text2.3 RawImage原始图像组件 3.七大组合控…

Unity UGUI系统

UI系统对比 对 UI 系统的选择取决于是为 Unity 编辑器开发 UI,还是为游戏或应用程序开发运行时 UI。 UI 的类型UI 工具包Unity UI(uGUI)IMGUI注意事项运行时(调试)✔ *✔✔这指用于调试用途的临时运行时 UI。运行时(游戏内&…

UGUI 详解

1.RectTransform RectTransform组件 继承自Transform组件,是2D界面中元素的Transform。 对比Transform增加了新的属性分别是:Anchor(锚点)和 Pivot(轴心点)。 属性: localPosition:图…

UGUI学习笔记(八)UGUI不规则响应区域

一、Unity自带的点击策略 在上一篇文章中我们了解到,UI的默认响应区域是UI元素所在的矩形框线内的区域。这也就意味着,当UI的图形为不规则形状时,点击图形的外部也可能会触发事件。 但其实Unity自带了一种不规则区域点击策略。要想使用它&…

[Unity UGUI图集系统]浅谈UGUI图集使用

**写在前面,下面是自己做Demo的时候一些记录吧,参考了很多网上分享的资源 一、打图集 1.准备好素材(建议最好是根据图集名称按文件夹分开) 2、创建一个SpriteAtlas 3、将素材添加到图集中 4、生成图集 到此,我们的图…

Ngui和Ugui的区别

NGUI的元素更新: UIPanel.LateUpdate采用轮询的方式,每帧都会执行,并且每帧都会有UIPanel.UpdateWidgets这个函数的调用,做的事情就是对这些UI元素的位置、缩放等信息的获取,也就是即使没有变化的UI元素,也…

Unity—UGUI

每日一句:读数、学习 去更远的地方,才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例:用户名和密码 Toggle组件 案例:冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容 Character Limit 输入字符…

【Unity3D】UGUI概述

1 UGUI 与 GUI 区别 GUI控件 在编译时不能可视化,并且界面不太美观,在实际应用中使用的较少。UGUI 在编译时可视化,界面美观,实际应用较广泛。 2 Canvas 渲染模式(Render Mode) Screen Space - Overlay&a…

怎样使用UGUI

什么是 UGUI UGUI 是 Unity 自带的一套 GUI 系统,含有基本的一些 UI 控件。 UGUI 控件有哪些? 我们常用的有 Canvas,Text,Image,Button,Toggle,Slider,Scroll Bar,Scroll…

Unity3D UGUI系列之合批

目录 1. 什么是UGUI的合批1.1 准备工作1.2 批处理1.3 批处理的意义1.4 UGUI的合批 2 分析工具的使用2.1 Frame Debugger的使用2.2 Profiler-UI的使用 3 UGUI合批规则3.1 UGUI合批初体验3.2 UGUI合批被打断初体验3.3 UGUI合批规则详解3.3.1 合批规则3.3.2 合批规则示例13.3.3 合…