1.支持向量机
Support Vector Machine,SVM。
1.1分类思想
以结构化风险最小为原则,兼顾训练误差与测试误差的最小化。
学习算法:
序列最小最优化算法SMO
2. SVM种类
2.1 线性可分支持向量机
特点:
训练数据线性可分;策略为硬间隔最大化;线性分类器。
模型
分类决策函数:
f ( x ) = sign ( w ∗ ⋅ x + b ∗ ) f(x)=\operatorname{sign}\left(w^{*} \cdot x+b^{*}\right)f(x)=sign(w∗⋅x+b∗)
分类超平面:
w ∗ ⋅ x + b ∗ = 0 w^{*} \cdot x+b^{*} = 0w∗⋅x+b∗=0
定义超平面关于样本点( x i , y i ) (x_i, y_i)(xi,yi)的函数间隔为:
γ ^ i = y i ( w ⋅ x i + b ) \hat{\gamma}_{i}=y_{i}\left(w \cdot x_{i}+b\right)γ^i=yi(w⋅xi+b)
定义超平面关于样本点( x i , y i ) (x_i, y_i)(xi,yi)的几何间隔:
γ i = y i ( w ∥ w ∥ ⋅ x i + b ∥ w ∥ ) \gamma_{i}=y_{i}\left(\frac{w}{\|{w}\|} \cdot x_{i}+\frac{b}{\|w\|}\right)γi=yi(∥w∥w⋅xi+∥w∥b)
几何距离是真正的点到面的距离。
定义所有样本点到面的距离的最小值:
γ = min i = 1 , … , N γ i \gamma=\min _{i=1, \ldots, N} \gamma_{i}γ=i=1,…,Nminγi
间隔最大化:对训练集找到几何间隔最大的超平面,也就是充分大的确信度对训练数据进行分类。
以下通过最大间隔法和对偶法进行实现:
最大间隔法:
1)构造约束最优化函数
max w , b γ s.t. y i ( w ∥ w ∥ ⋅ x i + b ∥ w ∥ ) ⩾ γ , i = 1 , 2 , ⋯ , N \begin{aligned} &\max _{w, b} \quad \gamma\\ &\text { s.t. } \quad y_{i}\left(\frac{w}{\|w\|} \cdot x_{i}+\frac{b}{\|w\|}\right) \geqslant \gamma, \quad i=1,2, \cdots, N \end{aligned}w,bmaxγs.t.yi(∥w∥w⋅xi+∥w∥b)⩾γ,i=1,2,⋯,N
如果假设函数间隔γ ^ = ∣ ∣ w ∣ ∣ γ = 1 \hat\gamma = ||w||\gamma = 1γ^=∣∣w∣∣γ=1,易得
上述等价于:
min 1 2 ∥ ω ∥ s.t. y i ( w x i + b ) − 1 ≥ 0 \begin{aligned} &\min \quad \frac{1}{2}\|\omega\|\\ &\text { s.t. } \quad y_{i}\left(w x_{i}+b\right)-1 \geq 0 \end{aligned}min21∥ω∥s.t.yi(wxi+b)−1≥0
2)解约束函数,即获得超平面
w ∗ ⋅ x + b ∗ = 0 w^{*} \cdot x+b^{*} = 0w∗⋅x+b∗=0
2.2 线性支持向量机
特点:
训练数据近似可分;策略为软间隔最大化;线性分类器。
线性不可分指,某些样本点不能满足函数间隔γ ^ ≥ 1 \hat\gamma \geq1γ^≥1的约束条件。
引入松弛因子ξ \xiξ 和惩罚参数C CC,得
min w , b , ξ 1 2 ∥ w ∥ 2 + C ∑ i = 1 N ξ i s.t. y i ( w ⋅ x i + b ) ⩾ 1 − ξ i , i = 1 , 2 , ⋯ , N ξ i ⩾ 0 , i = 1 , 2 , ⋯ , N \begin{aligned} &\min _{w, b, \xi} \quad \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{N} \xi_{i}\\ &\text { s.t. } \quad y_{i}\left(w \cdot x_{i}+b\right) \geqslant 1-\xi_{i}, \quad i=1,2, \cdots, N\\ &\xi_{i} \geqslant 0, \quad i=1,2, \cdots, N \end{aligned}w,b,ξmin21∥w∥2+Ci=1∑Nξis.t.yi(w⋅xi+b)⩾1−ξi,i=1,2,⋯,Nξi⩾0,i=1,2,⋯,N
优化目标,一方面是使得间隔尽量大,另一方面使得误分点的个数尽量少。
学习算法:
1.构建凸二次规划问题:
min α 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j ( x i ⋅ x j ) − ∑ i = 1 N α i s.t. ∑ i = 1 N α i y i = 0 0 ⩽ α i ⩽ C , i = 1 , 2 , ⋯ , N \begin{array}{ll} \min \limits_{\alpha} & \frac{1}{2} \sum_{i=1}^{N} \sum_{j=1}^{N} \alpha_{i} \alpha_{j} y_{i} y_{j}\left(x_{i} \cdot x_{j}\right)-\sum_{i=1}^{N} \alpha_{i} \\ \text { s.t. } & \sum_{i=1}^{N} \alpha_{i} y_{i}=0 \\ & 0 \leqslant \alpha_{i} \leqslant C, \quad i=1,2, \cdots, N \end{array}αmins.t.21∑i=1N∑j=1Nαiαjyiyj(xi⋅xj)−∑i=1Nαi∑i=1Nαiyi=00⩽αi⩽C,i=1,2,⋯,N
2.求得
w ∗ = ∑ i = 1 N α i ∗ y i x i w^{*}=\sum_{i=1}^{N} \alpha_{i}^{*} y_{i} x_{i}w∗=i=1∑Nαi∗yixi
存在 0 < α j ∗ < C 00
b ∗ = y j − ∑ i = 1 N y i α i ∗ ( x i ⋅ x j ) b^{*}=y_{j}-\sum_{i=1}^{N} y_{i} \alpha_{i}^{*}\left(x_{i} \cdot x_{j}\right)b∗=yj−i=1∑Nyiαi∗(xi⋅xj)
分类决策函数:
f ( x ) = sign ( w ∗ ⋅ x + b ∗ ) f(x)=\operatorname{sign}\left(w^{*} \cdot x+b^{*}\right)f(x)=sign(w∗⋅x+b∗)
2.3 核函数的SVM:
非线性映射(把低维映射到高维;采用核函数来实现映射过程)
3. 多分类问题
一对多:将需要划分的训练集进行枚举,取响应最大的那个;
一对一:两两组合,选出归类最多的那个组合;
一对一淘汰:引入分类器置信度信息的二分器;采用各个SVM二分器的分类间隔作为置信度。利用判别函数之间的冗余进行对“拒绝决策”的分类。
4. MATLAB代码
load fisheriris;
%取出样本的前2维(列)作为特征,并存入data(不需要预先定义类型,自动识别)中。
data=[meas(:,1),meas(:,2)];
%转化为“是不是setosa类”的2类问题
groups=ismember(species,'setosa');
%利用交叉验证随机分割数据集,train保存训练数据,test保存测试数据。
[train,test]=crossvalind('holdOut',groups);
%利用train中的数据,训练一个线性的支持向量机,训练好的分类保存在svmStruct。其中,data(train,:)把train==1的数据提取出来。
svmStruct=svmtrain(data(train,:),groups(train),'showplot',true);
%利用包含训练所得分类器信息的svmStruct对测试样本进行分类,分类结果保存操classes
classes=svmclassify(svmStruct,data(test,:),'showplot',true);
%计算测试样本的识别率
%正确分类的样本数目
nCorrect=sum(classes==groups(test,:));
%计算正确率
accuracy=nCorrect/length(classes);
SVMStruct可以自定义选项,如核函数。
参考:
基于PCA和SVM的人脸识别;
支持向量机SVM及python实现;