【机器学习】支持向量机(SVM)
感谢中国人民大学胡鹤老师,课程深入浅出,非常好
一、关于SVM
可以做线性分类、非线性分类、线性回归等,相比逻辑回归、线性回归、决策树等模型(非神经网络)功效最好

传统线性分类:选出两堆数据的质心,并做中垂线(准确性低)——上图左
SVM:拟合的不是一条线,而是两条平行线,且这两条平行线宽度尽量大,主要关注距离车道近的边缘数据点(支撑向量support vector),即large margin classification——上图右

使用前,需要对数据集做一个scaling,以做出更好的决策边界(decision boundary)

但需要容忍一些点跨越分割界限,提高泛化性,即softmax classification

在sklearn中,有一个超参数c,控制模型复杂度,c越大,容忍度越小,c越小,容忍度越高。c添加一个新的正则量,可以控制SVM泛化能力,防止过拟合。(一般使用gradsearch)
SVM特有损失函数Hinge Loss

二、LinearSVC(liblinear库,不支持kernel函数,但是相对简单,复杂度O(m*n))
同SVM特点吻合,仅考虑落在分类面附近和越过分类面到对方领域的向量,给于一个线性惩罚(l1),或者平方项(l2)
import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC iris = datasets.load_iris()
X = iris["data"][:,(2,3)]
y = (iris["target"]==2).astype(np.float64)
svm_clf = Pipeline((
("scaler",StandardScaler()),
("Linear_svc",LinearSVC(C=1,loss="hinge")),
))
svm_clf.fit(X,y)
print(svm_clf.predit([[5.5,1.7]]))
三、对于nonlinear数据的分类
有两种方法,构造高维特征,构造相似度特征
1. 使用高维空间特征(即kernel的思想),将数据平方、三次方。。映射到高维空间上
from sklearn.preprocessing import PolynomialFeatures
polynomial_svm_clf = Pipeline((
("poly_features", PolynomialFeatures(degree=3)),
("scaler", StandardScaler()),
("svm_clf", LinearSVC(C=10, loss="hinge"))
))
polynomial_svm_clf.fit(X, y)
这种kernel trick可以极大地简化模型,不需要显示的处理高维特征,可以计算出比较复杂的情况
但模型复杂度越强,过拟合风险越大
SVC(基于libsvm库,支持kernel函数,但是相对复杂,不能用太大规模数据,复杂度O(m^2 *n)-O(m^3 *n))
可以直接使用SVC(coef0:高次与低次权重)
from sklearn.svm import SVC
poly_kernel_svm_clf = Pipeline((
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="poly", degree=3, coef0=1, C=5))
))
poly_kernel_svm_clf.fit(X, y)

2. 添加相似度特征(similarity features)
例如,下图分别创造x1,x2两点的高斯分布,再创建新的坐标系统,计算高斯距离(Gaussian RBF Kernel径向基函数)

gamma(γ)控制高斯曲线形状胖瘦,数据点之间的距离发挥更强作用
rbf_kernel_svm_clf = Pipeline((
("scaler", StandardScaler()),
("svm_clf", SVC(kernel="rbf", gamma=5, C=0.001))
))
rbf_kernel_svm_clf.fit(X, y)

如下是不同gamma和C的取值影响

SGDClassifier(支持海量数据,时间复杂度O(m*n))
四、SVM Regression(SVM回归)
尽量让所用instance都fit到车道上,车道宽度使用超参数
控制,越大越宽
使用LinearSVR
from sklearn.svm import LinearSVR
svm_reg = LinearSVR(epsilon=1.5)
svm_reg.fit(X, y)
使用SVR
from sklearn.svm import SVR
svm_poly_reg = SVR(kernel="poly", degree=2, C=100, epsilon=0.1)
svm_poly_reg.fit(X, y)

五、数学原理:

w通过控制h倾斜的角度,控制车道的宽度,越小越宽,并且使得违反分类的数据点更少
1. hard margin linear SVM
优化目标:
,并且保证

2. soft margin linear SVM
增加一个新的松弛变量(slack variable)
,起正则化作用
优化目标:
,并且保证
放宽条件,即使有个别实例违反条件,也惩罚不大
3. LinearSVM
使用拉格朗日乘子法进行计算,α是松弛项后的结果

计算结果:
取平均值

KernelizedSVM
由于
故可先在低位空间里做点积计算,再映射到高维空间中。
下列公式表示,在高维空间计算可用kernel trick方式,直接在低维上面计算



几个常见的kernal及其function

【机器学习】支持向量机(SVM)的更多相关文章
- 机器学习——支持向量机SVM
前言 学习本章节前需要先学习: <机器学习--最优化问题:拉格朗日乘子法.KKT条件以及对偶问题> <机器学习--感知机> 1 摘要: 支持向量机(SVM)是一种二类分类模型, ...
- 吴裕雄 python 机器学习——支持向量机SVM非线性分类SVC模型
import numpy as np import matplotlib.pyplot as plt from sklearn import datasets, linear_model,svm fr ...
- 机器学习——支持向量机(SVM)之拉格朗日乘子法,KKT条件以及简化版SMO算法分析
SVM有很多实现,现在只关注其中最流行的一种实现,即序列最小优化(Sequential Minimal Optimization,SMO)算法,然后介绍如何使用一种核函数(kernel)的方式将SVM ...
- coursera机器学习-支持向量机SVM
#对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...
- 机器学习-支持向量机SVM
简介: 支持向量机(SVM)是一种二分类的监督学习模型,他的基本模型是定义在特征空间上的间隔最大的线性模型.他与感知机的区别是,感知机只要找到可以将数据正确划分的超平面即可,而SVM需要找到间隔最大的 ...
- 机器学习——支持向量机(SVM)
支持向量机原理 支持向量机要解决的问题其实就是寻求最优分类边界.且最大化支持向量间距,用直线或者平面,分隔分隔超平面. 基于核函数的升维变换 通过名为核函数的特征变换,增加新的特征,使得低维度空间中的 ...
- 机器学习支持向量机SVM笔记
SVM简述: SVM是一个线性二类分类器,当然通过选取特定的核函数也可也建立一个非线性支持向量机.SVM也可以做一些回归任务,但是它预测的时效性不是太长,他通过训练只能预测比较近的数据变化,至于再往后 ...
- 机器学习——支持向量机(SVM)之核函数(kernel)
对于线性不可分的数据集,可以利用核函数(kernel)将数据转换成易于分类器理解的形式. 如下图,如果在x轴和y轴构成的坐标系中插入直线进行分类的话, 不能得到理想的结果,或许我们可以对圆中的数据进行 ...
- 机器学习——支持向量机(SVM)之Platt SMO算法
Platt SMO算法是通过一个外循环来选择第一个alpha值的,并且其选择过程会在两种方式之间进行交替: 一种方式是在所有数据集上进行单遍扫描,另一种方式则是在非边界alpha中实现单遍扫描. 所谓 ...
- 机器学习:Python中如何使用支持向量机(SVM)算法
(简单介绍一下支持向量机,详细介绍尤其是算法过程可以查阅其他资) 在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异 ...
随机推荐
- Zookeeper-5分钟快速掌握分布式应用程序协调服
一.Zookeeper 安装 1.zookeeper支持brew安装. ➜ ~ brew info zookeeper zookeeper: stable (bottled), HEAD Centra ...
- D3--数据可视化实战总结
d3理解 标签(空格分隔): 未分类 1.绑定数据 [x] 定义:通过循环的方式将数据绑定在dom元素上,每个数据对应一个元素,所以这个数据的值就能来设定dom元素的width,height,x,y坐 ...
- Mybatis第二篇【CRUD、分页】
完成CRUD操作 我们在上一篇中已经简单知道了Mybatis是怎么使用的以及工作流程了,这次我们使用Mybatis来完成CRUD的操作,再次巩固Mybatis的开发步骤以及一些细节 包与类之间的结构 ...
- 小甲鱼:Python学习笔记001_变量_分支_数据类型_运算符等基础
1.下载并安装Python 3.5.0 Python是一个跨平台语言,Python从3.0的版本的语法很多不兼容2版本,官网找到最新的版本并下载:http://www.python.org 2.IDL ...
- Nexus5/6刷 lineageos 过程
如题,好久没刷机,体验下lineageos 由于之前Xposed官方一直没支持7.x,就没更新 测试三方Xposed正常使用,记录下过程供参考 注意,刷机有风险,刷机前备份,可以使用钛备份 0x01: ...
- 工作中对数组的一些处理,整理(结合underscore.js)
1.数组里边相同元素提取成map,并以'',''分隔 例如:var arr = [{a:"xx",b:''xxx''},{a:"xxx",b:''xxxxx'' ...
- 在http请求中的Content-Type
声明:multipart/form-data:既可以上传文件等二进制数据,也可以上传表单键值对,只是最后会转化为一条信息: x-www-form-urlencoded:只能上传键值对,并且键值对都是间 ...
- Angular4 后台管理系统搭建(9) - 用自定义angular指令,实现在服务端验证
最近这段时间发现,北京这用angular4 或 angular2的公司很少.几乎是没有.很担心自己是不是把精力放到了不应该的地方.白耽误了时间.但是随着我对新版angular框架理解的加深.个人感觉a ...
- SYSTEM_INFO
SYSTEM_INFO结构体包含了当前计算机的信息.这个信息包括计算机的体系结构.中央处理器的类型.系统中中央处理器的数量.页面的大小以及其他信息. SYSTEM_INFO,Win32 API函数Ge ...
- js如何判断一个对象为空
今天碰到一个问题如何判断一个对象为空? 总结的方法如下: 1.使用jquery自带的$.isEmptyObject()函数. var data={}; console.log($.isEmptyObj ...