matlab实现svm预测_机器学习笔记--SVM(MATLAB 实现代码)

本文介绍了如何使用MATLAB实现SVM进行二分类和多分类任务,强调了核函数选择的重要性,并给出了具体代码示例。通过实例展示了线性分类和非线性分类的区别,并利用MATLAB自带的fisheriris数据集演示了多分类过程。
摘要由CSDN通过智能技术生成

我们知道SVM的基本原理就是找一个超平面(广义平面)将样本分为几个部分,即分类。

MATLAB中自带SVM包,使用起来也十分方便,假如X是特征矩阵,Y是分类标签(可以是数值(1、2)也可以是string,总之有区别就行。)

二分类代码

SVMModel = fitcsvm(X,y) %训练分类器
CVSVMModel = crossval(SVMModel);   %分类器的交叉验证
classLoss = kfoldLoss(CVSVMModel)%  样本内错误率
[~,score] = predict(SVMModel,X_test)%; %样本外的数据进行分类预测
[label,scorePred] = kfoldPredict(CVSVMModel); %样本外的数据进行分类预测结果,

线性分类和非线性分类

我们在训练分类器的时候需要选择是线性分类还是非线性分类,比如如下两种:

6a47827ad2c332550b625bf92ea3fdf5.png

ecce96f24e64d644c1506728b47aa4f4.png

显然第一种适合线性分类,第二种适合曲线分类,也就是存在“异或”问题,需要映射到高维空间来寻找超平面。这种类似的选择称为“核函数”的选择,fitcsvm命令的KernelFunction可以选择三个核函数:'linear', 'gaussian' (or 'rbf'), 'polynomial',当然也可以自己编写核函数。核函数的选择是SVM分类器的最重要的参数。

举例:

SVMModel =  fitcsvm(X,indx,'ClassNames',[false true],'Standardize',true,...
        'KernelFunction','rbf','BoxConstraint',1);

分多类情形

MATLAB自带fisheriris数据,直接load就可以了。每一个样本都是两个特征,Y代表其分类,此数据中分类标签为3种。

load fisheriris
X = meas(:,3:4);
Y = species;

我们将数据画出散点图进行二维展示;图中不同的颜色即为不同的标签。

figure
gscatter(X(:,1),X(:,2),Y);
h = gca;
lims = [h.XLim h.YLim]; % Extract the x and y axis limits
title('{bf Scatter Diagram of Iris Measurements}');
xlabel('Petal Length (cm)');
ylabel('Petal Width (cm)');
legend('Location','Northwest');

64d2f69924b9b0fe49d032e49ab414b2.png

这里有三类,我们的思路是分别训练三个分类器。

SVMModels = cell(3,1);
classes = unique(Y);
rng(1); % For reproducibility

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);
end

用meshgrid画出网格,并将网格点作为测试样本。计算每个测试样本的得分。

其中scores是一个多行三列的向量,每一列代表此种分类的可能性大小。maxScore代表最可能的分类。

d = 0.02;
[x1Grid,x2Grid] = meshgrid(min(X(:,1)):d:max(X(:,1)),...
    min(X(:,2)):d:max(X(:,2)));
xGrid = [x1Grid(:),x2Grid(:)];
N = size(xGrid,1);
Scores = zeros(N,numel(classes));

for j = 1:numel(classes);
    [~,score] = predict(SVMModels{j},xGrid);
    Scores(:,j) = score(:,2); % Second column contains positive-class scores
end
[~,maxScore] = max(Scores,[],2);

我们二维显示训练样本和测试样本。其中将不同的预测分类结果用不同的颜色展示

figure
h(1:3) = gscatter(xGrid(:,1),xGrid(:,2),maxScore,...
         [0.1 0.5 0.5; 0.5 0.1 0.5; 0.5 0.5 0.1]);%预测分类结果用不同的颜色展示
hold on
h(4:6) = gscatter(X(:,1),X(:,2),Y);%画出原始的训练样本
title('{bf Iris Classification Regions}');
xlabel('Petal Length (cm)');
ylabel('Petal Width (cm)');
legend(h,{'setosa region','versicolor region','virginica region',...
    'observed setosa','observed versicolor','observed virginica'},...
    'Location','Northwest');
axis tight
hold off

8d1f5deee38371628a77551054ddf7f4.png

算法类文章我都会同期更新到个人公众号:宽客塔,欢迎关注~~

这个公众号以前是写金融类消息的,后来因为个人转行,就改为分享机器学习算法知识,也算是边学边写,跟大家共同学习~

  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值