机器学习之SVM支持向量机

目录

经典SVM

软间隔SVM

核SVM

SVM分类器应用于人脸识别

SVM优点

SVM缺点 


经典SVM

支持向量机(Support Vector Machine,SVM)是一种二分类模型,其基本思想是在特征空间中找到一个最优的超平面,使得正负样本点到该超平面的距离最大化,从而实现对样本的分类。

软间隔SVM

核SVM

SVM分类器应用于人脸识别

经典SVM为二分类模型,对于多分类模型,可以通过以下两种方法实现:

①One-vs-One(OVO):将每个类别之间的所有可能组合都训练一个二元分类器,然后通过投票或者加权投票来决定最终的分类结果。

②One-vs-All(OVA):将一个类别作为正例,其余所有类别作为负例,训练一个二元分类器,然后重复这个过程,直到每个类别都有一个分类器。最后通过投票或者加权投票来决定最终的分类结果。

对于人脸识别,SVM是用来分类的,我们可以使用像PCA、LDA、LPP、NPE等降维算法先进行数据降维再分类。

 SVM二分类代码,即文章开头的图片示例matlab代码:

% 生成随机数据
X = [randn(20,2)-2; randn(20,2)+2]; % 生成20个标签为-1的点和20个标签为1的点,分别在(-4,-4)和(4,4)的区域内
Y = [-1*ones(20,1); ones(20,1)]; % 将标签存入列向量y中

% 拟合SVM模型
svmModel = fitcsvm(X,Y); % 拟合线性SVM模型

% 绘制决策边界
w = svmModel.Beta; % 获取模型的权重向量w
b = svmModel.Bias; % 获取模型的偏置项b
a = -w(1)/w(2); % 计算决策边界的斜率
xx = linspace(-5,5); % 生成x坐标
yy = a*xx - b/w(2); % 计算决策边界的y坐标
margin = 1/sqrt(sum(w.^2)); % 计算间隔边界的宽度
yy_down = yy - sqrt(1+a^2)*margin; % 计算下界的y坐标
yy_up = yy + sqrt(1+a^2)*margin; % 计算上界的y坐标

% 绘制数据点和支持向量
figure; % 创建新的图形窗口
gscatter(X(:,1),X(:,2),Y,'br','x+'); % 绘制数据点,标签为-1的点用蓝色表示,标签为1的点用红色表示
hold on; % 将图形保持在当前状态,以便绘制其他图形
plot(xx,yy,'k-'); % 绘制决策边界
plot(xx,yy_down,'k--'); % 绘制间隔边界下界
plot(xx,yy_up,'k--'); % 绘制间隔边界上界
plot(svmModel.SupportVectors(:,1),svmModel.SupportVectors(:,2),'go','MarkerSize',10); % 绘制支持向量,用黑色圆点表示
axis([-5 5 -5 5]); % 设置坐标轴范围
legend('Class A','Class B','Decision boundary','Margin','Margin','Support vectors'); % 设置图例
hold off; % 关闭当前图形的保持状态,以便绘制其他图形

人脸识别多分类,使用OVO模式训练SVM模型,构建标签矩阵后进行模型训练,然后将数据写入excel表格,我这里的代码例子是先用PCA进行降维的,所以写入PCA.xlsx文件中。

halfDataNumber=pictureNumber/2;
Y=zeros(halfDataNumber,1);
for i=1:halfDataNumber
    Y(i)=floor((i-1)/testNumber)+1;
end

for dimension=5:5:160
    egienvector=egienvectors(:,1:dimension);
    trainDataTemp=egienvector'*trainData;
    testDataTemp=egienvector'*testData;
    right=0;
    model=fitcecoc(trainDataTemp',Y);
    YPredicted=predict(model,testDataTemp');
    for i=1:halfDataNumber
        if Y(i)==YPredicted(i)
            right=right+1;
        end
    end
    rate=right/halfDataNumber;
    SVMresult=[SVMresult,rate];
end

X=5:5:160;
plot(X,SVMresult);
writematrix(SVMresult,'PCA.xlsx');

SVM优点

优点:

  1. 高效性:SVM在处理高维度数据和样本数量较少的情况下表现出色,因为它只关注支持向量,而不受非支持向量的影响。
  2. 可解释性:SVM提供了对分类结果的良好解释能力。支持向量可以帮助我们了解决策边界及分类结果的原因。
  3. 鲁棒性:SVM对于处理输入空间中的噪音和异常值具有较好的鲁棒性。由于它的决策函数只依赖于支持向量,所以局部的扰动并不会对整体模型产生很大影响。
  4. 泛化能力:SVM通过最大化间隔来选择最优决策边界,从而提高了模型的泛化能力。这种特性使得SVM在处理未见过的数据时表现较好。

SVM缺点 

缺点:

  1. 参数调优困难:SVM中的核函数和正则化参数需要事先进行合理设置,而且对于不同的问题,最优的参数往往是不同的,因此调优可能需要耗费大量的时间和计算资源。
  2. 计算复杂度高:当样本量很大时,SVM的计算复杂度会显著增加,尤其是在使用非线性核函数时。这可能导致训练时间较长,并且在大规模数据集上的应用受到限制。
  3. 对缺失数据敏感:SVM对于缺失数据较为敏感,因为它主要依赖于支持向量,如果包含缺失值的样本成为支持向量,则可能会影响模型的性能。
  4. 难以处理多分类问题:原始的SVM算法是二分类算法,要将其扩展到多类别问题,通常需要借助一些技巧,如一对多(One-vs-Rest)或一对一(One-vs-One)策略。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MaolinYe(叶茂林)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值