02-33 非线性支持向量机


更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html

非线性支持向量机

支持向量机分为三种,线性可分支持向量机和线性支持向量机都是对线性可分的数据做处理,线性支持向量机也仅仅是对异常值做处理,并不是真正的对非线性可分数据做处理,接下来将会介绍支持向量机的第三种方法非线性支持向量机(non-linear support vector machine)。

一、非线性支持向量机学习目标

  1. 核技巧
  2. 正定核函数
  3. 常用的4个核函数
  4. 非线性支持向量机的步骤

二、非线性支持向量机详解

2.1 多项式回归和非线性支持向量机

曾在线性回归中讲到过多项式回归,此处只做简单回顾。

假设一个正方体的房子的价格与房子的边长、房子的占地面积和房子的体积有关系,然而现在只有房子的边长(x_1)一个特征,如果只拿特征去预测房子的价格,则有很大可能会欠拟合,因此需要增加房子的占地面积和体积这两个特征,即

[hat{y} = omega_1x_1 + omega_2{x_1}^2 + omega_3{x_1}^3 + b ]

(x_1=x_1,x_2={x_1}^2,x_3={x_1}^3),则多项式的线性模型变成

[hat{y} = omega_1x_1 + omega_2x_2 + omega_3x_3 + b ]

通过上述转变可以看到把线性回归转换成多项式回归之后又变回了线性回归,即对于一维不是线性的数据,把它映射到了三维之后,数据则变成了线性的数据。

其实非线性支持向量机即运用了这个思想,即非线性支持向量机把低维特征数据映射到高维,让数据变得线性可分,此时问题就变成了线性可分的数据分类问题。

2.2 核技巧

2.2.1 核函数引入

首先回顾线性支持向量机的目标函数的优化问题为

[egin{align} & underbrace{min}_{alpha} {{frac{1}{2}}sum_{i=1}^msum_{j=1}^malpha_ialpha_jy_iy_j(x_ix_j)-sum_{i=1}^malpha_i} \ & s.t. quad sum_{i=1}^malpha_iy_i=0 \ & quadquad 0leqalpha_igeq{C} end{align} ]

从上式可以发现线性支持向量机的目标函数对于特征的处理是以(x_ix_j)的形式出现的,此时如果定义一个低维特征空间到高维特征空间的映射函数(phi(x)),让所有特征映射到一个更高的维度,让数据线性可分,因此则可以继续按照线性支持向量机的方法优化目标函数,进而求出分离超平面和分类决策函数,即线性支持向量机的目标函数的优化问题变成了

[egin{align} & underbrace{min}_{alpha} {{frac{1}{2}}sum_{i=1}^msum_{j=1}^malpha_ialpha_jy_iy_j(phi(x_i)phi(x_j))-sum_{i=1}^malpha_i} \ & s.t. quad sum_{i=1}^malpha_iy_i=0 \ & quadquad 0leqalpha_igeq{C} end{align} ]

可以发现使用该方法貌似完美的解决了该问题,并且由于只是改动了数据的特征维度,但是之前一直使用的数据都是测试数据,如果真的到了生产上,那么特征可能不仅仅就是1个、2个,而是成千上万个,如果再对特征进行映射处理,那么特征的维度的快速增加,计算强度也随之增加,而且遇到无穷维的特征,那么根本无法计算,所以这并不是很合理的。而核函数则很好的解决了计算量大的问题。

2.2.2 核函数

(X)是低维输入空间(欧式空间(R^n)的子集或离散集合),(H)为高维特征空间(希尔伯特空间),若果存在一个从(X)(H)的映射(phi(x):X ightarrow H)使得对所有的(x,zin{X}),函数(K(x,z))满足条件

[K(x,z)=phi(x)phi(z) ]

则称(K(x,z))为核函数,(phi(x))为映射函数,式中的(phi(x)phi(z))(phi(x))(phi(z))的内积。

由于(x,zin{X}),在计算(K(x,z))的时候是在低维输入空间(R^n)中直接计算的,而不是通过(phi(x)phi(z))计算出(K(x,z)),因为(phi)是输入空间(R^n)到特征空间(H)的映射,特征空间(H)一般是高维的,甚至是无穷维的,并且就算给定了核(K(x,z)),特征空间和映射函数也不是唯一的,可以有多种不同的映射关系即不同的特征空间,即使是在同一特征空间里也可以取不同的映射关系。

总而言之核函数的好处在于它在低维空间上计算,而将实质上的分类效果即内及计算表现在了高维空间中,因此避免了直接在高维中的复杂计算。

通过使用核函数(K(x,z))后非线性支持向量机的分离超平面为

[sum_{i=1}^m sum_{i=1}^m{alpha_i}^*y_iK(x,x_i)+b^* = 0 ]

分类决策函数为

[f(x) = sign(sum_{i=1}^m{alpha_i}^*y_iK(x,x_i)+b^*) ]

2.2.3 核函数举例

假设输入空间是(R^2),核函数是(K(x,z)=(xz)^2),则可以通过上述信息找到特征空间(H)和映射(phi(x):R^2 ightarrow{H})

取特征空间(H=R^3),由于输入空间是二维的,记(x=(x_1,x_2)^T)(z=(z_1,z_2)^T),由于

[(xz)^2 = (x_1z_1+x_2z_2)^2=(x_1z_1)^2+2x_1z_1x_2z_2+(x_2z_2)^2 ]

即得映射为

[phi(x)=((x_1)^2,sqrt{2}x_1x_2,(x_2)^2)^T ]

容易验证

[phi(x)phi(z)=(xz)^2=K(x,z) ]

如果特征空间还是为(H=R^3),可得映射为

[phi(x)={frac{1}{sqrt{2}}}((x_1)^2-(x_2)^2,2x_1x_2,(x_1)^2+(x_2)^2)^T ]

同样容易验证

[phi(x)phi(z)=(xz)^2=K(x,z) ]

如果特征空间为(H=R^4),可得映射为

[phi(x)=((x_1)^2,x_1x_2,x_1x_2,(x_2)^2)^T ]

2.3 正定核函数

如果已知映射(phi(x)),可以通过(phi(x))(phi(z))的内积求得核函数,但是不构造映射能否直接判断一个给定的函数是不是核函数呢?下面将讲述函数得满足什么条件才能成为一个核函数。

一般情况下核函数都称作正定核函数(positive definite kernel function),此处将直接说明正定核函数的充要条件。一个函数想要成为一个正定核函数,必须满足它里面的任何点的集合形成的Gram矩阵是半正定的,即对于任意的(x_iin{X},quad i=1,2,ldots,m)(K(x_i,x_j))对应的Gram矩阵(K=[K(x_i,x_j)]_{m*m})是半正定矩阵,则(K(x,x))是正定核函数。

由于寻找某个函数是否为核函数的过程是非常困难的,此处不多赘述。并且牛人们已经找到了很多核函数,但在实际问题中常用的核函数就只有几个,接下来将只介绍工业上常用的几个核函数,同时这些核函数也是sklearn库中仅有的几个核函数。

2.4 线性核函数

线性核函数(linear kernel)本质上就是线性支持向量机,既可以把线性支持向量机称作使用线性核函数的非线性支持向量机,线性核函数的表达式为

[K(x,z) = xz ]

在此情形下,分类决策函数为

[f(x) = sign(sum_{i=1}^m{alpha_i}^*y_i(xx_i)+b^*) ]

2.5 多项式核函数

多项式核函数(polynomial kernel)是线性支持向量机常用的核函数之一,表达式为

[K(x,z) = (gamma{xz}+r)^d ]

其中(gamma,r,d)都是超参数。

在此情形下,分类决策函数为

[f(x) = sign(sum_{i=1}^m{alpha_i}^*y_i((gamma{xx_i}+r)^d)+b^*) ]

2.6 高斯核函数

高斯核函数(Gaussian kernel)对应的支持向量机是高斯径向基函数(radial basis function,RBF)分类器,它是非线性支持向量机最主流的核函数,表达式为

[K(x,z) = e^{-gamma{||x-z||}^2}, quad gamma>0 ]

其中(gamma)是超参数。

在此情形下,分类决策函数为

[f(x) = sign(sum_{i=1}^m{alpha_i}^*y_i(e^{gamma{||x-x_j||}^2})+b^*) ]

2.7 Sigmoid核函数

Sigmoid核函数(sigmoid kernel)也是线性支持向量机常用的核函数之一,表达式为

[K(x,z) = anh(gamma{xz}+r) ]

其中(gamma,r)都是超参数,( anh())为双曲正切函数(注:该函数图形类似于Sigmoid函数,至于为什么还要称作Sigmoid核函数,你可以问问sklearn的作者)。

在此情形下,分类决策函数为

[f(x) = sign(sum_{i=1}^m{alpha_i}^*y_i( anhgamma{xx_j}+r)+b^*) ]

2.7.1 tanh()函数

# tanh()函数图例
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x = np.linspace(-5, 5, 666)
y = np.tanh(x)

plt.plot(x, y, label='tanh()')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

png

2.8 核函数的选择

  1. 如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM
  2. 如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel
  3. 如果Feature的数量比较小,而样本数量很多,需要手工添加一些feature变成第一种情况
  4. 如果无法确定使用哪个核函数,可以所有的核函数都测试几次,然后判定哪个核函数更适合

三、非线性支持向量机流程

3.1 输入

(m)个样本的线性可分训练集(T={(x_1,y_1),(x_2,y_2),cdots,(x_m,y_m)}),其中(x_i)(n)维特征向量,(y_i)为二元输出即值为(1)或者(-1)

3.2 输出

分离超平面的参数(w^*)(b^*)以及分类决策函数

3.3 流程

  1. 选择适当的核函数(K(x,z))和一个惩罚系数(C>0),构造约束优化问题为

[egin{align} & underbrace{min}_{alpha} {frac{1}{2}} sum_{i=1}^msum_{j=1}^malpha_ialpha_jy_iy_j(K(x_i,x_j)) - sum_{i=1}^malpha_i \ & s.t. sum_{i=1}^m alpha_iy_i =0 \ & quad 0geqalpha_ileq{C}, quad i=1,2,ldots,m end{align} ]

  1. 使用SMO算法求出上式最小时对应的(alpha^*)
  2. 计算(w^*)

[w^* = sum_{i=1}^m alpha^*y_iphi(x_i) ]

  1. 找到所有的(S)个支持向量,即满足(0<{alpha_i}^*<C)的样本((x_s,y_s)),通过(y_s(sum_{i=1}^S{alpha_i}^*y_iK(x_i,x_s)+b^*)-1=0)计算出每个支持向量对应的(b^*),计算出这些所有的(b^*)的平均值即为最终的(b^*={frac{1}{S}}sum_{i=1}^Sb^*)
  2. 求得分离超平面为

[sum_{i=1}^m{alpha_i}^*y_iK(x,x_i)+b^* = 0 ]

  1. 求得分类决策函数为

[f(x) = sign(sum_{i=1}^m{alpha_i}^*y_iK(x,x_i)+b^*) ]

线性支持向量机的步骤和线性可分支持向量机的步骤大致相同,由于线性支持向量机使用了松弛因子,两者之间最大的不同点在于对(b^*)值的考虑。

四、非线性支持向量机优缺点

4.1 优点

  1. 可以对非线性可分的数据分类

4.2 缺点

  1. 只支持二分类问题,对于多分类问题需要使用OvR等其他辅助方法
  2. 支持分类问题不支持回归问题

五、小结

非线性支持向量机借用了多项式回归的思想,把数据映射到高维空间,让数据从线性不可分变得线性可分。又由于核函数的使用,它不需要在数据集映射到高维之后再去计算特征之间的关系,而是在数据映射之前就能够计算特征之间的关系,这也正是核函数的巧妙之处。

线性支持向量机其实还是有一个很大的问题,人们总是追求完美,如果这么13的算法既能够支持分类问题,又能够支持回归问题那岂不是上天了,这种算法有是一定有的,即支持向量回归(support vector regression, SVR)。

原文地址:https://www.cnblogs.com/nickchen121/p/11686751.html