目录

  • 1. 线性可分
  • 2. 支持向量机SVM

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:mfor j = 1:ncmd = ['-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) > bestaccbestacc = 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)

参考结果图:

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

  1. 机器学习之支持向量机SVM及代码示例

    一.线性可分SVM SVM算法最初是用来处理二分类问题的,是一种有监督学习的分类算法. 对于线性可分的二分类问题,我们可以找到无穷多个超平面,将两类样本进行区分.(超平面:一维中是一个点:二维中是一条 ...

  2. 机器学习实战 支持向量机SVM 代码解析

    机器学习实战 支持向量机SVM 代码解析 <机器学习实战>用代码实现了算法,理解源代码更有助于我们掌握算法,但是比较适合有一定基础的小伙伴.svm这章代码看起来风轻云淡,实则对于新手来说有 ...

  3. 【机器学习基础】(四):通俗理解支持向量机SVM及代码实践

    上一篇文章我们介绍了使用逻辑回归来处理分类问题,本文我们讲一个更强大的分类模型.本文依旧侧重代码实践,你会发现我们解决问题的手段越来越丰富,问题处理起来越来越简单. 支持向量机(Support Vec ...

  4. 机器学习之支持向量机SVM之python实现ROC曲线绘制(二分类和多分类)

    目录 一.ROC曲线 二.TP.FP.TN.FN 三. python绘制ROC曲线(二分类) 1.思路 2.关键代码 3.完整代码 四. python绘制ROC曲线(多分类) 五.参考文献 一.ROC ...

  5. OpenCV之ml 模块. 机器学习:支持向量机(SVM)介绍 支持向量机对线性不可分数据的处理

    支持向量机(SVM)介绍 目标 本文档尝试解答如下问题: 如何使用OpenCV函数 CvSVM::train 训练一个SVM分类器, 以及用 CvSVM::predict 测试训练结果. 什么是支持向 ...

  6. 优达学城机器学习之--支持向量机(SVM)

    前言 SVM是支持向量机的简称(Support Vector Machine) 文章目录如下: 简述 选择分隔线 核函数(kernel)及其参数c, gamma 过拟合 over-fitting SV ...

  7. [机器学习算法]支持向量机SVM原理简介

    一.问题和超平面描述 给定训练集 分类学习最基本的想法就是基于训练集在样本空间中找到一个划分超平面,将不同类别的样本分开,但能将训练样本分开的划分超平面可能有很多,如下图所示: 直观来看,应该去找位于 ...

  8. 机器学习:支持向量机SVM的SVC和SVR

    支持向量机SVM SVM的工作原理及分类 支持向量机的原理 线性可分的SVM 非线性可分的支持向量机 支持向量机分类SVC 支持向量机回归SVR SVR原理 SVR模型 时间序列曲线预测 SVM的工作 ...

  9. python生成6位验证码随机数,需包含英文字母大写、小写和数字(含代码和注释)

    具体见代码和注释: def get_code():code_list = []# for i in range(10): # 0~9for i in range(48,57): #ASCII表示的数字 ...

最新文章

  1. ios5 ARC机制介绍和使用
  2. 计算机科学学院参加些什么比赛,计算机科学学院学生在“2018年中国大学生计算机设计大赛(西北赛区)”中喜获佳绩...
  3. 《陶哲轩实分析》部分勘误
  4. day18--django3之Ajax
  5. 小波阈值去噪法基础理论
  6. ubuntu下使用ppa安装codeblocks集成开发环境
  7. Oracle 数据库管理脚本 命名规范
  8. asp oracle 分页显示,asp + oracle 分页方法(不用存储过程)
  9. PyCharm设置Python版本
  10. php 管理员界面源码,ThinkPHP通用后台管理系统TP-Admin
  11. 标准差和标准误差、平均值
  12. html 图片循环轮播,如何在Web端实现动画切换效果一致的无限循环图片轮播?
  13. 基于lstm+crf实现电子病历实体信息识别 完整的代码+数据集+说明 毕设
  14. 构建自己的GAFATA
  15. 写在前面-数据结构与算法分析
  16. Android开发-基本概念小整理(一)为了面试的小伙伴们所准备~~
  17. 升级android安全补丁,谷歌发布 2019 年 12 月的 Android 安全补丁
  18. canvas——绘制图片——动图制作
  19. 测试/开发程序员幽默的 “自嘲“?印象流派......
  20. 破解root密码详细流程

热门文章

  1. 关于联合利华:我的第一次正式实习的单位!撒花!
  2. 龟兔赛跑的升级版本和在课业学习上的应用
  3. 【转】从Mac/OS和iOS开放源码浅谈UNIX家谱
  4. 字符串转换 - 应该熟练掌握的东西
  5. 4.编写程序,打印1到100之内的整数,但数字中包含7的要跳过
  6. JavaScript 工作原理之十一-渲染引擎及性能优化小技巧 1
  7. PHP大文件分片上传
  8. 在CentOS 7系统里使用465端口发送邮件
  9. web报告工具FineReport在使用方法和解决方案常见错误遇到(一)
  10. 网络运维现状及发展趋势分析