1、算法简介
1-1、算法思路
支持向量机(SVM)是90年代中期发展起来的基于统计学习理论的一种机器学习方法,作用是基于训练集在样本空间中找到一个划分超平面。如果处理的是二维平面数据,此时超平面为一条直线,当处理的是三维空间数据时,超平面是一个二维平面。
这个超平面的表达式为:wTx+b = 0。如果两类的标签是+1和-1,则两个标签值的边界表达式为:wTx+b = 1 、wTx+b = -1。即如果一个样本点经过wTx+b运算后的结果大于1,则为+1类;运算后的结果小于-1,则为-1类;如果结果正好等于1或-1,则为“支持向量”;当大于-1小于1时,则认为这个点处于间隔之内。
一般来讲,支持向量机是一种二分类算法。其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
“间隔”的作用和意义:一个点距离分离超平面的远近,可以用来表示分类预测的确信程度,有以下原则:在超平面wTx+b=0确定的情况下:|wTx+b|能够相对表示点x距离超平面的远近,而w.x+b的标签与类标记的标签是否一致(例如:点在正侧,wTxi+b大于0,而yi为1,yi大于0,分类正确;点在负侧,wTxi+b小于0,yi为-1,符号一致,分类正确;反之符号不一致)。
wT为要求的变量。
现实任务中,原始样本空间也许并不能存在一个能正确划分出两类样本的超平面,不难想到,没有条件就创造条件。一般采用的方法是:在原本的样本上添加一层映射的函数--核函数。目的是将样本从原始空间映射到一个更高维的特征空间中,使得样本在这个新的高维空间中可以被线性划分为两类,即在空间内线性划分。常用的核函数有:线性核、多项式核、高斯核、拉普拉斯核、sigmoid核、通过核函数之间的线性组合或直积等运算得出的新核函数。效果见1-2中的原始样本、经过核函数后的样本。
1-2、图示



1-3、算法流程
1--- 如果将间隔设置为1的话,可以得到h1-- w.x+b=1、h2-- w.x+b=-1两条决策边界,那么h1和h2的几何距离依赖于 h1-- w.x+b=0的法向量w,即几何距离-margin是|wTx+b| / ||w||,即 2/||w||
2--- 求margin的最大值问题就转换为了求||w||的最小值,||w||为w的二阶范数
3--- 综合上边的h1、h2,可转换为一个凸优化问题求最优解,具体推导过程见https://blog.csdn.net/v_july_v/article/details/7624837或https://www.jianshu.com/p/12ea00aa5ce4
1-4、优缺点
1-4-1、优点
a、使用核函数可以向高维空间进行映射
b、使用核函数可以解决非线性的分类
c、分类思想很简单,就是将样本与决策面的间隔最大化
d、分类效果较好
1-4-2、缺点
a、大规模训练样本难以实施
b、解决多分类问题困难
c、对参数和核函数选择敏感
2、实践
2-1、采用bobo老师创建简单测试用例
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
# 导入sklearn 鸢尾花数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
X = X[y<2,:2] # 只取前两个label的前两个特征,便于画图
y = y[y<2]
plt.scatter(X[y==0,0], X[y==0,1], color='red')
plt.scatter(X[y==1,0], X[y==1,1], color='blue')
plt.show() # 见plt.show1

from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
standardScaler = StandardScaler()
standardScaler.fit(X)
X_standard = standardScaler.transform(X)
svc = LinearSVC(C=1e9) # C越大 越趋向于hardsvc
svc.fit(X_standard, y)
svc.coef_
# [[ 4.03243037 -2.50699737]]
svc.intercept_
# [0.92736595]
网友评论