目录html
更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
支持向量机分为三种,线性可分支持向量机和线性支持向量机都是对线性可分的数据作处理,线性支持向量机也仅仅是对异常值作处理,并非真正的对非线性可分数据作处理,接下来将会介绍支持向量机的第三种方法非线性支持向量机(non-linear support vector machine)。算法
曾在线性回归中讲到过多项式回归,此处只作简单回顾。数据结构
假设一个正方体的房子的价格与房子的边长、房子的占地面积和房子的体积有关系,然而如今只有房子的边长\(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 \]
经过上述转变能够看到把线性回归转换成多项式回归以后又变回了线性回归,即对于一维不是线性的数据,把它映射到了三维以后,数据则变成了线性的数据。机器学习
其实非线性支持向量机即运用了这个思想,即非线性支持向量机把低维特征数据映射到高维,让数据变得线性可分,此时问题就变成了线性可分的数据分类问题。函数
首先回顾线性支持向量机的目标函数的优化问题为
\[ \begin{align} & \underbrace{\min}_{\alpha} {{\frac{1}{2}}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j(x_ix_j)-\sum_{i=1}^m\alpha_i} \\ & s.t. \quad \sum_{i=1}^m\alpha_iy_i=0 \\ & \quad\quad 0\leq\alpha_i\geq{C} \end{align} \]
从上式能够发现线性支持向量机的目标函数对于特征的处理是以\(x_ix_j\)的形式出现的,此时若是定义一个低维特征空间到高维特征空间的映射函数\(\phi(x)\),让全部特征映射到一个更高的维度,让数据线性可分,所以则能够继续按照线性支持向量机的方法优化目标函数,进而求出分离超平面和分类决策函数,即线性支持向量机的目标函数的优化问题变成了
\[ \begin{align} & \underbrace{\min}_{\alpha} {{\frac{1}{2}}\sum_{i=1}^m\sum_{j=1}^m\alpha_i\alpha_jy_iy_j(\phi(x_i)\phi(x_j))-\sum_{i=1}^m\alpha_i} \\ & s.t. \quad \sum_{i=1}^m\alpha_iy_i=0 \\ & \quad\quad 0\leq\alpha_i\geq{C} \end{align} \]
能够发现使用该方法貌似完美的解决了该问题,而且因为只是改动了数据的特征维度,可是以前一直使用的数据都是测试数据,若是真的到了生产上,那么特征可能不只仅就是1个、2个,而是成千上万个,若是再对特征进行映射处理,那么特征的维度的快速增长,计算强度也随之增长,并且遇到无穷维的特征,那么根本没法计算,因此这并非很合理的。而核函数则很好的解决了计算量大的问题。学习
设\(X\)是低维输入空间(欧式空间\(R^n\)的子集或离散集合),\(H\)为高维特征空间(希尔伯特空间),若果存在一个从\(X\)到\(H\)的映射\(\phi(x):X \rightarrow H\)使得对全部的\(x,z\in{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,z\in{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^*) \]
假设输入空间是\(R^2\),核函数是\(K(x,z)=(xz)^2\),则能够经过上述信息找到特征空间\(H\)和映射\(\phi(x):R^2\rightarrow{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 \]
若是已知映射\(\phi(x)\),能够经过\(\phi(x)\)和\(\phi(z)\)的内积求得核函数,可是不构造映射可否直接判断一个给定的函数是否是核函数呢?下面将讲述函数得知足什么条件才能成为一个核函数。
通常状况下核函数都称做正定核函数(positive definite kernel function),此处将直接说明正定核函数的充要条件。一个函数想要成为一个正定核函数,必须知足它里面的任何点的集合造成的Gram矩阵是半正定的,即对于任意的\(x_i\in{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库中仅有的几个核函数。
线性核函数(linear kernel)本质上就是线性支持向量机,既能够把线性支持向量机称做使用线性核函数的非线性支持向量机,线性核函数的表达式为
\[ K(x,z) = xz \]
在此情形下,分类决策函数为
\[ f(x) = sign(\sum_{i=1}^m{\alpha_i}^*y_i(xx_i)+b^*) \]
多项式核函数(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^*) \]
高斯核函数(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^*) \]
Sigmoid核函数(sigmoid kernel)也是线性支持向量机经常使用的核函数之一,表达式为
\[ K(x,z) = \tanh(\gamma{xz}+r) \]
其中\(\gamma,r\)都是超参数,\(\tanh()\)为双曲正切函数(注:该函数图形相似于Sigmoid函数,至于为何还要称做Sigmoid核函数,你能够问问sklearn的做者)。
在此情形下,分类决策函数为
\[ f(x) = sign(\sum_{i=1}^m{\alpha_i}^*y_i(\tanh\gamma{xx_j}+r)+b^*) \]
# 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()
有\(m\)个样本的线性可分训练集\(T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}\),其中\(x_i\)为\(n\)维特征向量,\(y_i\)为二元输出即值为\(1\)或者\(-1\)。
分离超平面的参数\(w^*\)和\(b^*\)以及分类决策函数
非线性支持向量机借用了多项式回归的思想,把数据映射到高维空间,让数据从线性不可分变得线性可分。又因为核函数的使用,它不须要在数据集映射到高维以后再去计算特征之间的关系,而是在数据映射以前就可以计算特征之间的关系,这也正是核函数的巧妙之处。
线性支持向量机其实仍是有一个很大的问题,人们老是追求完美,若是这么13的算法既可以支持分类问题,又可以支持回归问题那岂不是上天了,这种算法有是必定有的,即支持向量回归(support vector regression, SVR)。