1. 什么是支持向量机
通俗来讲,SVM是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化。
如:
SVM要做的就是找出划分蓝点和红点的一条线,且使这条线尽可能远离这些点(即就是让两条虚线之间的距离Margin最大)。
中间那条关键的线我们叫它“超平面”。我们现在处理的是二维平面数据,此时超平面为一条直线。当我们处理的是三维空间数据时,超平面就是一个平面。而当我们处理的是100维数据时,超平面就是一个99维的对象。
这个超平面被描述为:WTx + b = 0
支持向量(Support Vector):
在距离超平面很远的区域的样本点对于分割线的位置都没有影响的,分割线是由正好落在margin边界上的点决定的。这些关键点支撑起了一个分割超平面,这些“支撑”的点(向量)便叫做支持向量Support Vector。
2. SVM的优化目标
目标函数中的符号解释:
- 为了简化WTx + b,我们将给W增加一维W0=1变为θ\thetaθ,给x也增加一维x0=b,
那么WTx + b = θT\theta^TθTx (注:m表示m个样本,n表示x的维数) - cost1函数图像为左边的图,也就是当x>=1时cost1(x)=0,当x<1时cost1(x) = -x+1;
cost0函数图像为右边的图,也就是当x<=-1时cost0(x)=0,当x>-1时cost0(x) = x+1。
如何理解上述的损失函数:
目标函数可以理解为是由三部分组成的:分类误差,边际误差,超参数C
分类误差
如上述,分类正确的时候是如果y=1,θT\theta^TθTx>=1;如果y=0,θT\theta^TθTx<=-1,此时误差都为0。
下图中分类正确的情况我们希望蓝点都处于Wx+b=1的上面,红点都处于Wx+b=-1的下面。
分类错误的时候
-
如果y=1,θT\theta^TθTx<1,那么分类造成的误差就是cost1(θTxi\theta^Tx^iθTxi) = −θTxi+1-\theta^Tx^i+1−θTxi+1。解释:
以Wx+b=1为基准,下面的蓝点为分类错误的点,以Wx+b=1向下画平行线,假设误差点所处线为Wx+b=0.3,那么误差值就是1−0.3=0.71-0.3=0.71−0.3=0.7。
因为Wx+b=0.3故 −θTxi=−0.3-\theta^Tx^i=-0.3−θTxi=−0.3,那么 −θTxi+1=0.7-\theta^Tx^i+1=0.7−θTxi+1=0.7。 -
如果y=0,θT\theta^TθTx>-1,那么分类造成的误差就是cost0(θTxi\theta^Tx^iθTxi) = θTxi+1\theta^Tx^i+1θTxi+1。 解释:
以Wx+b=-1为基准,上面的红点为分类错误的点,以Wx+b=-1向上画平行线,假设误差点所处线为Wx+b=-0.3,那么误差值就是−0.3−(−1)=0.7-0.3-(-1)=0.7−0.3−(−1)=0.7。
因为Wx+b=-0.3故θTxi=−0.3\theta^Tx^i=-0.3θTxi=−0.3,那么 θTxi+1=0.7\theta^Tx^i+1=0.7θTxi+1=0.7。
边际误差
Margin就是Wx+b=1与Wx+b=-1之间的距离,也就是Wx+b=1与Wx+b=0之间的距离的两倍。
将两条线平移到上图位置,此时,W向量就垂直这两条线。
原因:以x为二维为例,则W也是二维,W向量即为(w1,w2)。在Wx=0这条线上随便找两个点a(x1,x2),b(x3,x4),ab向量就是(x3−x1,x4−x2)(x3-x1,x4-x2)(x3−x1,x4−x2)那么w1∗x1+w2∗x2=0w1*x1+w2*x2=0w1∗x1+w2∗x2=0, w1∗x3+w2∗x4=0w1*x3+w2*x4=0w1∗x3+w2∗x4=0
ab向量与W向量的点积就为:
w1(x3−x1)+w2(x4−x2)=w1∗x3+w2∗x4−(w1∗x1+w2∗x2)=0w1(x3-x1)+w2(x4-x2) = w1*x3+w2*x4-(w1*x1+w2*x2)=0w1(x3−x1)+w2(x4−x2)=w1∗x3+w2∗x4−(w1∗x1+w2∗x2)=0
所以W向量就垂直Wx=0。
设W向量与Wx=1的交点坐标为(p,q),那么
- 因为交点在Wx=1上,所以w1∗p+w2∗q=1w1*p+w2*q=1w1∗p+w2∗q=1
- 因为交点也在W向量上,所以(p,q)=k(w1,w2)(p,q)=k(w1,w2)(p,q)=k(w1,w2)
将上述两个方程联立可以解得k=1w12+w22k=\frac1{w1^2+w2^2}k=w12+w221
综上Margin就为kWkWkW 这个向量的长度的二倍,也就是2∣W∣\frac2{|W|}∣W∣2 (|W|表示W向量的长度即w12+w22\sqrt{w1^2+w2^2}w12+w22)
我们要最大化距离就是最大化2∣W∣\frac2{|W|}∣W∣2,也就是最小化|W|,等价于最小化|W|2
这样就是目标函数的Σj=1nθj2\Sigma_{j=1}^n\theta_j^2Σj=1nθj2,加上12\frac1221的系数就是求导方便
这不就是L2正则化化吗,没错,所以SVM是自带正则化的
超参数C
C参数用来平衡错分与间隔大小。C越大,模型越注重分类误差,反之,模型越注重边际误差。
所以当模型欠拟合时需要增大C,模型过拟合时需要减小C。
3. 核函数
当遇到非线性的问题时该怎么办呢?这时就需要将原始的特征向量映射到更高维的空间H,从而转化为线性可分问题,此时作为决策边界的超平面就为:WTϕ(X)+b=0W^T\phi(X)+b=0WTϕ(X)+b=0,ϕ\phiϕ为X到H映射函数。
因为映射函数是复杂的非线性函数,因此其内积的计算是困难的,这时就引入了核函数,即定义映射函数的内积为核函数(kernel function),K(X,Z)=ϕ(X)⋅ϕ(Z)K(X,Z)=\phi(X) \cdot \phi(Z)K(X,Z)=ϕ(X)⋅ϕ(Z)。
常用的核函数:
多项式核:K(X,Z)=(XTZ)nK(X,Z)=(X^TZ)^nK(X,Z)=(XTZ)n
径向基函数核(RBF核)又被称为高斯核:K(X,Z)=exp(−∣∣X−Z∣∣22σ2)K(X,Z)=exp(-\frac{||X-Z||^2}{2\sigma^2})K(X,Z)=exp(−2σ2∣∣X−Z∣∣2)
4. sklearn中的SVM
from sklearn.svm import SVC
model = SVC()
model.fit(x_values, y_values)
SVC()的常见参数:
- C:C 参数。
- kernel:内核。最常见的内核为 ‘linear’、‘poly’ 和 ‘rbf’。
- degree:如果内核是多项式,则此参数为内核中最大单项式的次数。
- gamma:如果内核是径向基函数,则此参数为γ\gammaγ参数。γ\gammaγ等效于上述高斯核中的12σ2\frac{1}{2\sigma^2}2σ21,γ\gammaγ太大模型会发生过拟合现象
#定义一个次数为4、C参数为0.1的多项式内核模型
model = SVC(kernel='poly', degree=4, C=0.1)