机器学习(三):支持向量机SVM(含代码和注释)

本文介绍了线性可分的概念,如何在二维和高维空间中判断,并详细阐述了支持向量机(SVM)在寻找最优分类超平面的过程,包括支持向量的定义和最大化间隔margin的策略。还提供了Matlab实现代码示例,用于实际数据的SVM训练和预测。
摘要由CSDN通过智能技术生成

1. 线性可分

二维空间中,线性可分数据表示为可用一条直线分开两类数据;若不存在一条直线分开两类数据,则为非线性可分
在这里插入图片描述在这里插入图片描述
可以把它拓展到更高维度空间。若在三维空间中有一个二维平面能分开两类数据,则为线性可分;否则线性不可分。若在N维空间中有一个N-1维平面能分开两类数据,则为线性可分;否则线性不可分。
在这里插入图片描述
在这里插入图片描述
以二维空间为例,若一条直线w1x1 + w2x2 + b = 0能分开两类数据,则可定义( w1x1 + w2x2 + b < 0) 和 ( w1x1 + w2x2 + b > 0) 来判断数据属于哪一类。
在这里插入图片描述
最终可定义为:
在这里插入图片描述在这里插入图片描述

2. 支持向量机SVM

如果数据是线性可分的,那么肯定存在无数个超平面(直线可看作一维)可以将数据分开。而究竟哪一个超平面最好呢?支持向量机就是为了找到最合适的一个超平面来划分数据。支持向量机是一个有监督学习算法,需要输入Xi和输出标签Yi。
在这里插入图片描述
大多数人可能直观感觉2号线最好,但是2号线是如何找出来的呢?它一定是最好的吗?不一定,但是支持向量机可以找到唯一的一条最优直线。
在二维空间中,定义支持向量为直线分别两侧平移,直至接触到数据,所接触到的数据被称为“支持向量”(图中标红的样本点),两条平移直线间的间隔为Margin
在这里插入图片描述
因此,支持向量机SVM寻找的最优分类直线应满足三个条件:
(1) 该直线分开了两类;
(2) 该直线最大化间隔margin;
(3) 该直线处于间隔的中间,到所有支持向量距离相等
在高维空间中,直线可换为超平面。寻找最优超平面的问题可以变为用严格的数学推导求解最优化问题,结论如下:
在这里插入图片描述

具体推导:
首先声明两个事实:
在这里插入图片描述
在这里插入图片描述
基于事实1,我们可以利用a(a不等于0)去缩放w和b,可以看作是在高维空间中,我们选取得超平面( w转置x+b=0等价于 aw转置x+ab = 0 )不变,而是通过收缩因子a,将支持向量x0(距离超平面最近的样本点)拉近到超平面附近,使其满足|w转置x0+b| = 1,当然,理论上可以不为1,为了方便表示,取1。
在这里插入图片描述
基于事实2,支持向量x0到超平面的距离如下式:(分子等于1是由上面定义 |w转置
x0+b| = 1 得来的)
在这里插入图片描述
因此,若想要最大化支持向量到超平面距离d,则需要最小化||w||。(取1/2的||w||的平方是为了方便求导,本质上还是最小化||w||)
在这里插入图片描述
由于支持向量到超平面的距离会等于1,支持向量以外的样本点到超平面的距离会大于1,因此可以得到以下限制条件:
在这里插入图片描述
其中,yi是为了协调超平面两边的样本点xi计算(w转置xi+b>1,此时定义yi = +1)或者(w转置xi+b < -1 ,此时定义yi = -1),与第一部分线性可分的最终定义类似。
在这里插入图片描述
以上是在数据线性可分的情况下的推论,如果数据线性不可分,我们需要对上述推导进行修改,基本思想为将低维空间中线性不可分的数据映射到高维空间,使其在高维空间中线性可分,具体推导不在赘述,可以观看浙江大学mooc机器学习胡浩基老师的支持向量机课程,以上是观看老师课程后的简要笔记+自己的理解,可能存在不足之处。

matlab实现代码(需要提前导入svm工具包,我的是3.21版本的libsvm,可以对照代码,修改成自己的数据集):

%% I. 清空环境变量
clear all
clc

%% II. 导入数据,可换为自己的数据
load BreastTissue_data.mat

%%
% 1. 随机产生训练集和测试集
n = randperm(size(matrix,1));

%%
% 2. 训练集——80个样本
train_matrix = matrix(n(1:80),:);
train_label = label(n(1:80),:);

%%
% 3. 测试集——26个样本
test_matrix = matrix(n(81:end),:);
test_label = label(n(81:end),:);

%% III. 数据归一化
[Train_matrix,PS] = mapminmax(train_matrix');
Train_matrix = Train_matrix';
Test_matrix = mapminmax('apply',test_matrix',PS);
Test_matrix = Test_matrix';

%% IV. SVM创建/训练(RBF核函数)
%%
% 1. 寻找最佳c/g参数——交叉验证方法
[c,g] = meshgrid(-10:0.2:10,-10:0.2:10);
[m,n] = size(c);
cg = zeros(m,n);
eps = 10^(-4);
v = 5;
bestc = 1;
bestg = 0.1;
bestacc = 0;
for i = 1:m
    for j = 1:n
        cmd = ['-v ',num2str(v),' -t 2',' -c ',num2str(2^c(i,j)),' -g ',num2str(2^g(i,j))];
        cg(i,j) = svmtrain(train_label,Train_matrix,cmd);     
        if cg(i,j) > bestacc
            bestacc = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end        
        if abs( cg(i,j)-bestacc )<=eps && bestc > 2^c(i,j) 
            bestacc = cg(i,j);
            bestc = 2^c(i,j);
            bestg = 2^g(i,j);
        end               
    end
end
cmd = [' -t 2',' -c ',num2str(bestc),' -g ',num2str(bestg)];

%%
% 2. 创建/训练SVM模型(利用上面选出的最好参数训练)
model = svmtrain(train_label,Train_matrix,cmd);

%% V. SVM仿真测试
[predict_label_1,accuracy_1,~] = svmpredict(train_label,Train_matrix,model);
[predict_label_2,accuracy_2,~] = svmpredict(test_label,Test_matrix,model);
%result_1 = [train_label predict_label_1];
%result_2 = [test_label predict_label_2];

%% VI. 绘图
figure
plot(1:length(test_label),test_label,'r-*')
hold on
plot(1:length(test_label),predict_label_2,'b:o')
grid on
legend('真实类别','预测类别')
xlabel('测试集样本编号')
ylabel('测试集样本类别')
string = {'测试集SVM预测结果对比(RBF核函数)';
          ['accuracy = ' num2str(accuracy_2(1)) '%']};
title(string)

参考结果图:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值