支持向量机分类应用——fitcsvm函数

1 支持向量机模型的构建

1.1 内容介绍

支持向量机(Support Vector Machine,简称SVM)是一种监督学习算法,主要用于对数据进行分类和回归分析。SVM的定义和核心概念可以归纳如下:

定义:

支持向量机是一种在特征空间上寻找最大间隔的线性分类器,其目标是找到一个最优的超平面,使得不同类别的数据点之间的距离(即间隔)最大化。这个最优超平面能够将特征空间划分为两个部分,使得其中一个部分的所有样本都满足分类边界上的条件。

构成:

超平面:SVM通过寻找一个最优的超平面来对样本进行分割,这个超平面就是所谓的分类边界;支持向量:在最优超平面附近,距离边界最近的那些点被称为支持向量。这些支持向量对于分类结果具有决定性的作用,因为它们是划分边界上的关键点;间隔最大化:SVM的目标是通过最大化两类数据之间的间隔来找到最优超平面。这个间隔可以是硬间隔(线性可分情况下)或软间隔(线性不可分情况下,通过引入松弛变量和惩罚项来实现);核函数:为了处理非线性分类问题,SVM引入了核函数的概念。核函数能够将原始数据映射到更高维的空间中,从而使得数据在新空间中更容易被线性分类。

用途:

模式识别:如手写数字识别、人脸识别等;图像识别:在图像处理和计算机视觉领域,SVM被用于图像分类、目标检测等任务;文本分类:在自然语言处理领域,SVM被用于文本分类、情感分析等任务

1.2 函数介绍

1.2.1 模型训练函数

模型训练方式

Mdl = fitcsvm(X,Y)x,y为n行,x列x为输入变量数,n为数据集个数
Mdl = fitcsvm(Tbl,Y)tbl为表格该分类器使用表 Tbl 中的预测变量和向量 Y 中的类标签进行训练
Mdl = fitcsvm(Tbl,ResponseVarName)使用表 Tbl 中包含的样本数据进行训练ResponseVarName 是 Tbl 中变量的名称,该变量包含一类或二类分类的类标签

其他内容:

CVSVMModel = crossval(SVMModel)

classLoss = kfoldLoss(CVSVMModel)

10折交叉验证(10-fold Cross-Validation)是一种评估模型性能的技术,它可以帮助我们了解模型在不同数据子集上的表现,从而更准确地估计模型的泛化能力。这种方法将数据集分成10个大小相等的子集(或“折”),然后轮流使用其中9个子集作为训练集来训练模型,剩下的1个子集作为测试集来评估模型的性能。这个过程会重复10次,每次选择不同的子集作为测试集,最终会得到10个评估结果。这10个结果的平均值通常被用作模型性能的估计

SVMModel = fitcsvm('OutlierFraction',0.05);

'OutlierFraction',0.05就会告诉函数在训练模型之前,将数据集中大约5%的数据点视为离群点,并可能采取一些措施来处理这些离群点(比如忽略它们、降低它们的权重或进行其他形式的调整)。

SVMModels = cell(3,1);

classes = unique(Y);

for j = 1:numel(classes)

indx = strcmp(Y,classes(j)); % Create binary classes for each classifier

SVMModels{j} = fitcsvm(X,indx,'ClassNames',[false true],'Standardize',true,...

'KernelFunction','rbf','BoxConstraint',1);

创建3*1数组,存储三个model,实现多分类

Mdl = fitcsvm(X,Y,'OptimizeHyperparameters','auto', ...

    'HyperparameterOptimizationOptions',struct('AcquisitionFunctionName', ...

    'expected-improvement-plus'))

使用了fitcsvm函数来训练一个支持向量机(SVM)模型,并且指定了自动优化超参数的选项。代码中的'OptimizeHyperparameters','auto'让MATLAB自动选择需要优化的超参数,并使用默认的优化方法进行优化。通过'HyperparameterOptimizationOptions',您进一步指定了超参数优化的高级选项,即使用'expected-improvement-plus'作为采集函数

2. 支持向量机分类的应用

2.1 基础应用——花卉种类分类

%prflower
clc;clear;
load fisheriris
inds = ~strcmp(species,'setosa');
X = meas(inds,3:4);
y = species(inds);
SVMModel = fitcsvm(X,y);
classOrder = SVMModel.ClassNames;
sv = SVMModel.SupportVectors;
figure
gscatter(X(:,1),X(:,2),y)
hold on
plot(sv(:,1),sv(:,2),'ko','MarkerSize',10)
legend('versicolor','virginica','Support Vector')
% hold off
% figure(2)
sv = SVMModel.SupportVectors; % Support vectors
beta = SVMModel.Beta; % Linear predictor coefficients
b = SVMModel.Bias; % Bias term
X1 = linspace(min(X(:,1)),max(X(:,1)),100);
X2 = -(beta(1)/beta(2)*X1)-b/beta(2);
plot(X1,X2,'-')
m = 1/sqrt(beta(1)^2 + beta(2)^2);  % Margin half-width
X1margin_low = X1+beta(1)*m^2;
X2margin_low = X2+beta(2)*m^2;
X1margin_high = X1-beta(1)*m^2;
X2margin_high = X2-beta(2)*m^2;
plot(X1margin_high,X2margin_high,'b--')
plot(X1margin_low,X2margin_low,'r--')


hold off

 

2.2 人像分类

function函数分别命名为data与alldata,data:获得灰度图像——边缘处理——获得数据集,alldata获得文件夹下数据集

% %prface利用SVM进行人脸识别
% %数据处理
rng("default") % For reproducibility of the partition %设计随机数种子
clc;clear;
Path = 'C:\Users\lzy\Desktop\人脸识别项目\faker\'; % 设置数据存放的文件夹路径
File = dir(fullfile(Path,'*g')); % 显示文件夹下所有符合后缀名为.txt文件的完整信息
FileNames = {File.name}'; % 提取符合后缀名为.txt的所有文件的文件名,转换为n行1列
% clc;clear;
% x3='C:\Users\lzy\Desktop\小虎.jpg';
% x1='C:\Users\lzy\Desktop\faker.jpg';
% x2='C:\Users\lzy\Desktop\faker2.jpg';
%x4={x1,x2,x3};
y_label=alldata(FileNames,Path);
Path = 'C:\Users\lzy\Desktop\人脸识别项目\xiaohu\'; % 设置数据存放的文件夹路径
File = dir(fullfile(Path,'*g')); % 显示文件夹下所有符合后缀名为.txt文件的完整信息
FileNames = {File.name}'; % 提取符合后缀名为.txt的所有文件的文件名,转换为n行1列
y_label2=alldata(FileNames,Path);
y_label=[y_label;y_label2];
x_label={};
len1=size(y_label);
len2=size(y_label2);
for x=1:(len1(1)-len2(1))
x_label{end+1}='faker';
end
for x=1:len2(1)
x_label{end+1}='xiaohu';
end
x_label=x_label';
SVMModel = fitcsvm(y_label,x_label)%模型训练

%新图片预测
new_path='C:\Users\lzy\Desktop\人脸识别项目\pre\faker.jpg';%新的图片路径
[new_g1,new_g2]=data(new_path);
figure(2)
imshow(new_g1)
[label,score]=predict(SVMModel,double(new_g2))
title(label)
if(label{1}=='faker')
fprintf("识别正确");
end

function [Y1,Y2]=data(X)
I = imread(X);%读取照片
newsize=[400,400];
I=imresize(I,newsize);
Y = rgb2gray(I);%将图像灰度化
imshowpair(I,Y,'montage') %将原始图像与其灰度图像并排显示
Y1 = edge(Y,'sobel',0.05); %可以省去0.06,系统会默认。
Y2=Y1';
Y2=Y2(:);
Y2=Y2';

function y=alldata(x,path)
str=[];
for i=1:length(x)
% append(path,x{i})
[y1,y2]=data(append(path,x{i})); 
str=[str;y2];
end
y=str;
End

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值