SVM原理及代码实现(学习笔记)
1.概念
支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面.它分类的思想是,给定给一个包含正例和反例的样本集合,svm的目的是寻找一个超平面来对样本根据正例和反例进行分割,从而达到分类的目的。
2.SVM-线性分类器
对于二维空间来说,我理解的是能够在给定两组不同的数据中用一条直线把这两组数据给分离开来,如下图示。
超平面
对于多维来说,如果能够存在一个线性函数能够将样本完全正确的分离开来,那么这些数据就是线性可分的,反之,称为非线性可分的。什么叫线性函数呢?通俗地讲,就是在一维空间里就是一个点,在二维空间里就是一条直线,三维空间里就是一个平面,以此类推。
如果不关注空间的维数,这种线性函数其实就是超平面。
下面讲述一个例子(转自视频:https://www.bilibili.com/video/BV1D64y1f7r6?p=1):
在样本空间中,我们可以用线性方程来说明:
对于二维空间来说,线性方程可表示为:w1x1+w2x2+b=0。其中,w=(w1;w2;w3;……w d)为法向量,决定超平面的方向;b为位移项,决定了超平面与原点之间的距离,显然,划分超平面可被法向量w和位移b确定,下面我们将其记为(w,b)。样本空间中任意点x到超平面(w,b)的距离可写为
在分类问题中给定输入数据和学习目标:
,其中输入数据的每个样本都包含多个特征并由此构成特征空间(feature space):
,而学习目标为二元变量表示负类(negative class)和正类(positive class)。
若输入数据所在的特征空间存在作为决策边界(decision boundary)的超平面将学习目标按正类和负类分开,并使任意样本的点到平面距离大于等于1 [2] :
则称该分类问题具有线性可分性,参数w,b分别为超平面的法向量和截距。
满足该条件的决策边界实际上构造了2个平行的超平面作为间隔边界以判别样本的分类:
所有在上间隔边界上方的样本属于正类,在下间隔边界下方的样本属于负类。两个间隔边界的距离
被定义为边距(margin),位于间隔边界上的正类和负类样本为支持向量(support vector)。
拉格朗日乘子法求得KNN条件:
SM算法
非线性分类:把数据放到高维度上再次进行分割
当f(x)=x时,这组数据是个直线,如上半部分,但是当我把这组数据变为f(x)=x^2时,这组数据就变成了下半部分的样子,也就可以被红线所分割
核函数:
SVM通过某非线性变换 φ( x) ,将输入空间映射到高维特征空间。特征空间的维数可能非常高。如果SVM的求解只用到内积运算,而在低维输入空间又存在某个函数 K(x, x′) ,它恰好等于在高维空间中这个内积,即K( x, x′) =<φ( x) ⋅φ( x′) > 。那么支持向量机就不用计算复杂的非线性变换,而由这个函数 K(x, x′) 直接得到非线性变换的内积,使大大简化了计算。这样的函数 K(x, x′) 称为核函数。
常见核函数:
h度多项式核函数
高斯径向基和函数:图像分类
S型核函数
在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类(异常值检测)以及回归分析。
其具有以下特征:
(1)SVM可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值。而其他分类方法都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解。
(2) SVM通过最大化决策边界的边缘来实现控制模型的能力。尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等。
(3)SVM一般只能用在二类问题,对于多类问题效果不好。
from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt#准备训练样本
x=[[1,8],[3,20],[1,15],[3,35],[5,35],[4,40],[7,80],[6,49]]
y=[1,1,-1,-1,1,-1,-1,1]##开始训练
clf=svm.SVC() ##默认参数:kernel='rbf'
clf.fit(x,y)#print("预测...")
#res=clf.predict([[2,2]]) ##两个方括号表面传入的参数是矩阵而不是list##根据训练出的模型绘制样本点
for i in x:res=clf.predict(np.array(i).reshape(1, -1))if res > 0:plt.scatter(i[0],i[1],c='r',marker='*')else :plt.scatter(i[0],i[1],c='g',marker='*')##生成随机实验数据(15行2列)
rdm_arr=np.random.randint(1, 15, size=(15,2))
##回执实验数据点
for i in rdm_arr:res=clf.predict(np.array(i).reshape(1, -1))if res > 0:plt.scatter(i[0],i[1],c='r',marker='.')else :plt.scatter(i[0],i[1],c='g',marker='.')
##显示绘图结果
plt.show()
运行结果:
松弛变量:
数据本身可能有噪点,会使得原本线性可分的数据需要映射到高维度去。对于这种偏离正常位置很远的数据点,我们称之为 outlier ,在我们原来的 SVM 模型里,outlier 的存在有可能造成很大的影响,因为超平面本身就是只有少数几个 support vector 组成的,如果这些 support vector 里又存在 outlier 的话,其影响就很大了。
因此排除outlier点,可以相应的提高模型准确率和避免Overfitting的方式。
解决多分类问题:
经典的SVM只给出了二类分类的算法,现实中数据可能需要解决多类的分类问题。因此可以多次运行SVM,产生多个超平面,如需要分类1-10种产品,首先找到1和2-10的超平面,再寻找2和1,3-10的超平面,以此类推,最后需要测试数据时,按照相应的距离或者分布判定。
SVM与其他机器学习算法对比(图):
代码如下:
from sklearn import svm import numpy as np import matplotlib.pyplot as plt##设置子图数量 fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(7, 7)) ax0, ax1, ax2, ax3 = axes.flatten()# 准备训练样本 x = [[1, 8], [3, 20], [1, 15], [3, 35], [5, 35], [4, 40], [7, 80], [6, 49]] y = [1, 1, -1, -1, 1, -1, -1, 1] '''说明1:核函数(这里简单介绍了sklearn中svm的四个核函数,还有precomputed及自定义的)LinearSVC:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想RBF:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数polynomial:多项式函数,degree 表示多项式的程度-----支持非线性分类Sigmoid:在生物学中常见的S型的函数,也称为S型生长曲线说明2:根据设置的参数不同,得出的分类结果及显示结果也会不同''' ##设置子图的标题 titles = ['LinearSVC (linear kernel)','SVC with polynomial (degree 3) kernel','SVC with RBF kernel', ##这个是默认的'SVC with Sigmoid kernel'] ##生成随机试验数据(15行2列) rdm_arr = np.random.randint(1, 15, size=(15, 2))def drawPoint(ax, clf, tn):##绘制样本点for i in x:ax.set_title(titles[tn])res = clf.predict(np.array(i).reshape(1, -1))if res > 0:ax.scatter(i[0], i[1], c='r', marker='*')else:ax.scatter(i[0], i[1], c='g', marker='*')##绘制实验点for i in rdm_arr:res = clf.predict(np.array(i).reshape(1, -1))if res > 0:ax.scatter(i[0], i[1], c='r', marker='.')else:ax.scatter(i[0], i[1], c='g', marker='.')if __name__ == "__main__":##选择核函数for n in range(0, 4):if n == 0:clf = svm.SVC(kernel='linear').fit(x, y)drawPoint(ax0, clf, 0)elif n == 1:clf = svm.SVC(kernel='poly', degree=3).fit(x, y)drawPoint(ax1, clf, 1)elif n == 2:clf = svm.SVC(kernel='rbf').fit(x, y)drawPoint(ax2, clf, 2)else:clf = svm.SVC(kernel='sigmoid').fit(x, y)drawPoint(ax3, clf, 3)plt.show()
运行结果:
SVM原理及代码实现(学习笔记)相关推荐
- monodepth-pytorch代码实现学习笔记(一)
monodepth-pytorch代码实现学习笔记(一) 前言 一.前期准备 1. 数据集 2. 训练与测试 二.数据预处理 1. data_loader.py 1.1 __init__(self,r ...
- 《区块链原理与技术》学习笔记(六) — 区块链安全
<区块链原理与技术>学习笔记 第六部分 四.区块链网络层 1. 网络层安全 1.1 分布式拒绝服务攻击(DDos) 1.2 延展性攻击 1.3 日蚀攻击 1.4 分割攻击 1.5 延迟攻击 ...
- 步步为营 .NET 代码重构学习笔记 九
步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...
- 步步为营 .NET 代码重构学习笔记 十一
步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...
- 步步为营 .NET 代码重构学习笔记 十
步步为营 .NET 代码重构学习笔记系列 步步为营 .NET 代码重构学习笔记 一.为何要代码重构 步步为营 .NET 代码重构学习笔记 二.提炼方法(Extract Method) 步步为营 .NE ...
- 【相机标定与三维重建原理及实现】学习笔记1——相机模型数学推导详解
目录 前言 一.小孔成像模型 二.坐标系的变换 1.世界坐标系到相机坐标系的变换(刚体变换)[xw^→xc^\boldsymbol {\hat{x_{w}}}\rightarrow \boldsymb ...
- 决策树模型(ID3/C4.5/CART)原理和底层代码解读 学习笔记
本文作者:合肥工业大学 管理学院 钱洋 email:1563178220@qq.com 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载 如下为个人的学习笔记,使用latex编写,再写成文本太麻烦 ...
- 《浏览器工作原理与实践》学习笔记
浏览器原理 前言 本文是学习李兵老师的<浏览器工作原理与实践>过程中记录笔记,详细链接见文末 进程vs线程 进程:一个应用程序的运行实例就是一个进程,详细来说就是:启动一个应用程序的时候, ...
- python基础代码事例-学习笔记:python3,代码。小例子习作(2017)
http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...
- STARK代码详细学习笔记
STARK代码学习笔记 前言 一.环境安装 二.设置项目路径 三.训练STARK 四.测试STARK 1. 下载预训练模型 2. 准备测试数据集 五.STARK代码细节 六.测试过程可视化 前言 本文 ...
最新文章
- 【爬虫】使用xpath与lxml移除特定标签
- Node Sass does not yet support your current environment: Windows 64-bit然如何解决,cnpm此问题解决方法
- 一大波 Android 刘海屏来袭,全网最全适配技巧!
- 伪元素写竖线_用伪元素画出太极图
- java-jvm-full gc频繁的分析及解决
- Android性能优化典范
- 网站不能访问的解决思路
- xcode5.0打包IPA
- 蓝桥杯——寻找数组中的最大值
- 单元测试的一些基本概念
- STM32 LED灯的另一种写法
- Spring Boot笔记-自动配置(Spring Boot封装成jar被其他项目引用)
- 接口压测_Locust接口压测和插入集合点实战
- 墨迹天气语音包_广州天气|冷空气到货,任性吃火锅的理由又有了
- ubuntu cmake安装_如何在Emacs中得到一个真正的Terminal?vterm安装指南
- gitee项目能用SVN拉取吗_基于SpringBoot的车牌识别系统(附项目地址)
- 软考网络工程师备考技巧大揭秘
- c语言搜索算法伪代码,FFT算法伪代码
- 绘制流程图的基本规则
- this与bind(this)
热门文章
- Wireshark:No interfaces found解决方法(Windows 10)
- 【调剂】西京学院信息工程学院招收计算机类、电子信息类专业硕士研究生
- 【自动驾驶模拟器AirSim快速入门 | 03】模型训练
- 关于tomcat运行突然变慢很多,加载特别缓慢,这个问题影响了我很久才得以解决
- Word+Mathtype的双栏科研论文排版技巧
- 揭秘日食记:坐拥6000万粉丝,姜老刀如何坚持一手内容一手商业?
- 利用哈夫曼树实现对文件的压缩和解压缩的示例代码
- 手机做时钟的两种方式
- 小米发行区间确定!发行市值最高871亿美元,凭什么比BAT还贵?
- 使用万用表准测测电压,你都掌握了吗?