支持向量机
##1 简介
适用情况:支持向量机主要针对小样本数据进行学习、分类以及预测
起源:Logistic回归(0/1分类问题)
基本模型:定义在特征空间上的间隔最大化的线性分类器
学习策略:间隔最大化
学习算法:求解凸二次规划的最优化算法
学习目标:在特征空间中找到一个分离超平面,使得实例分到不同的类
当训练集线性不可分时,通过使用核技巧和软间隔最大化,学习非线性支持向量机
核函数:将输入从输入空间映射到特征空间得到的特征向量之间的内积
输入都由输入空间转换到特征空间,支持向量机的学习是在特征空间进行的
感知机 VS 支持向量机
感知机:利用误分类最小策略,求得分离超平面,可得到无穷解
支持向量机:利用间隔最大化得到最优分离超平面,得到唯一解
##2 间隔与支持向量
###2.1 相关定义
分离超平面:$ \boldsymbol{w}^T· \boldsymbol{x}+b=0$
一般来说,一个点距离分离超平面的远近可以表示分类预测的确信程度
函数间隔:
y
(
w
T
⋅
x
+
b
)
y(\boldsymbol{w}^T· \boldsymbol{x}+b)
y(wT⋅x+b) 能够表示:①分类的正确性 ②距离的远近(即分类的确信性度)
几何间隔:
y
(
w
T
⋅
x
+
b
)
∣
∣
w
∣
∣
\frac{y(\boldsymbol{w}^T· \boldsymbol{x}+b)}{||\boldsymbol{w}||}
∣∣w∣∣y(wT⋅x+b)
支持向量:在线性可分情况下,训练集的样本点中与分离超平面距离最近的样本点的实例,即满足
y
(
w
⋅
x
+
b
)
−
1
=
0
y(\boldsymbol{w}·\boldsymbol{x}+b)-1=0
y(w⋅x+b)−1=0
对
y
=
+
1
y=+1
y=+1的正例点,支持向量在超平面
H
1
=
w
T
⋅
x
+
b
=
1
H1=\boldsymbol{w}^T· \boldsymbol{x}+b=1
H1=wT⋅x+b=1上,
对
y
=
−
1
y=-1
y=−1的负例点,支持向量在超平面
H
2
=
w
T
⋅
x
+
b
=
−
1
H2=\boldsymbol{w}^T· \boldsymbol{x}+b=-1
H2=wT⋅x+b=−1上
在H1和H2上的点就是支持向量
H1和H2之间的距离称为间隔(margin),间隔依赖于分离超平面的法向量w,等于
2
∣
∣
w
∣
∣
\frac2{||\boldsymbol{w}||}
∣∣w∣∣2
###2.2 线性可分SVM算法
基本思想:求解能够正确划分训练数据集并且几何间隔最大的分离超平面
(将正负实例点分开,且对最难分的实例点<离超平面最近的点>也有足够大的确信度将它们分开)
对于最优化问题 m a x 1 ∣ ∣ w ∣ ∣ max\frac1{||\boldsymbol{w}||} max∣∣w∣∣1 等价于 m i n 1 2 ∣ ∣ w ∣ ∣ 2 min\frac12{||\boldsymbol{w}||}^2 min21∣∣w∣∣2
算法1 线性可分SVM学习算法——最大间隔法
输入:线性可分训练数据集
T
=
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
n
,
y
n
)
T={(\boldsymbol{x}_1,y_1),(\boldsymbol{x}_2,y_2),...,(\boldsymbol{x}_n,y_n)}
T=(x1,y1),(x2,y2),...,(xn,yn)
输出:最大间隔分离超平面和分类决策函数
(1)构造并求解约束最优化问题:
m
i
n
w
,
b
=
1
2
∣
∣
w
∣
∣
2
min_{\boldsymbol{w},b}=\frac12 ||\boldsymbol{w}||^2
minw,b=21∣∣w∣∣2
s
.
t
.
y
i
(
w
⋅
x
i
+
b
)
−
1
≥
0
,
i
=
1
,
2
,
.
.
.
,
n
s.t.y_i(\boldsymbol{w}·\boldsymbol{x}_i+b)-1\ge0,i=1,2,...,n
s.t.yi(w⋅xi+b)−1≥0,i=1,2,...,n
求得最优解
w
∗
,
b
∗
\boldsymbol{w}^*,b^*
w∗,b∗
(2)由此得到分离超平面:
(
w
∗
)
T
⋅
x
+
b
∗
=
0
(\boldsymbol{w}^*)^T·\boldsymbol{x}+b^*=0
(w∗)T⋅x+b∗=0
分类决策函数
f
(
x
)
=
s
i
g
n
(
(
w
∗
)
T
⋅
x
+
b
∗
)
f(x)=sign((\boldsymbol{w}^*)^T·\boldsymbol{x}+b^*)
f(x)=sign((w∗)T⋅x+b∗)
· 最大间隔分离超平面的存在具有唯一性
##3 对偶问题
原始问题是一个凸二次规划的问题
通过引入拉格朗日乘子
α
i
≥
0
\alpha_i\geq0
αi≥0,将有约束的原始问题转化为无约束的对偶问题。
由此,可将算法1 中的约束最优化问题可以转换为以下拉格朗日函数:
L
(
w
,
b
,
α
)
=
1
2
∣
∣
w
∣
∣
2
−
∑
i
=
1
N
α
i
(
y
i
(
w
T
⋅
x
i
+
b
)
−
1
)
L( \boldsymbol{w},b,\boldsymbol{\alpha})=\frac12{||\boldsymbol{w}||}^2-\sum_{i=1}^{N}\alpha_i(y_i(\boldsymbol{w}^T·\boldsymbol{x}_i+b)-1)
L(w,b,α)=21∣∣w∣∣2−i=1∑Nαi(yi(wT⋅xi+b)−1)
其中,
α
=
(
α
1
,
α
2
,
.
.
.
,
α
N
)
T
\boldsymbol{\alpha}=(\alpha_1,\alpha_2,...,\alpha_N)^T
α=(α1,α2,...,αN)T
原问题的对偶问题转化为一个极大极小问题:
m
a
x
α
m
i
n
w
,
b
L
(
w
,
b
,
α
)
max_\boldsymbol{\alpha} min_{\boldsymbol{w},b}L({\boldsymbol{w},b},\boldsymbol{\alpha})
maxαminw,bL(w,b,α)
1)求
m
i
n
w
,
b
L
(
w
,
b
,
α
)
min_{\boldsymbol{w},b}L({\boldsymbol{w},b},\boldsymbol{\alpha})
minw,bL(w,b,α)
L
(
w
,
b
,
α
)
L({\boldsymbol{w},b},\boldsymbol{\alpha})
L(w,b,α)对
w
,
b
\boldsymbol{w},b
w,b的偏导为零
2)求
m
i
n
w
,
b
L
(
w
,
b
,
α
)
min_{\boldsymbol{w},b}L({\boldsymbol{w},b},\boldsymbol{\alpha})
minw,bL(w,b,α)的极大
##4 应用举例
MOOC 北京理工大学 Python机器学习应用
e.g.上证指数涨跌预测
实验目的:根据给出当前时间前150天的历史数据,预测当天上证指数的涨跌
import pandas as pd #pandas:用来加载CSV数据的工具包
import numpy as np #numpy:支持高级大量的维度数组与矩阵运算,也针对数组运算提供大量的数学函数库
from sklearn import svm
from sklearn import cross_validation #交叉验证
#数据加载和数据预处理
data=pd.read_csv('stock/000777.csv',encoding='gbk',parse_dates=[0],index_col=0)
#axis=0(按0列排序),ascending=True(升序),inplace=True(排序后覆盖原数据)
data.sort_index(0,ascending=True,inplace=True)
#选取5列数据作为特征:收盘价、最高价、最低价、开盘价、成交量
dayfeature=150
featurenum=5*dayfeature
x=np.zeros((data.shape[0]-dayfeature,featurenum+1))
y=np.zeros((data.shape[0]-dayfeature))
for i in range(0,data.shape[0]-dayfeature):
x[i,0:featurenum]=np.array(data[i:i+dayfeature]\
[[u'收盘价',u'最高价',u'最低价',u'开盘价',u'成交量']]).reshape((1,featurenum))
x[i,featurenum]=data.ix[i+dayfeature][u'开盘价']
for i in range(0,data.shape[0]-dayfeature):
if data.ix[i+dayfeature][u'收盘价']>=data.ix[i+dayfeature][u'开盘价']:
y[i]=1
else:
y[i]=0
clf=svm.SVC(kernel='rbf')
result=[]
for i in range(5):
x_train,x_test,y_train,y_test=cross_validation.train_test_split(x,y,test_size=0.2)
clf.fit(x_train,y_train)
result.append(np.mean(y_test==clf.predict(x_test)))
print("svm classifier accuacy:")
print(result)
参考资料:
《统计学习方法》李航 第7章 支持向量机
支持向量机通俗导论(理解SVM的三层境界)