##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的三层境界)