一切过往,皆为序章,一切未知,皆为终章。

机器学习系列3:SVM

写在前面:本文主要对svm进行理论阐述及实战(python),理论部分参考《模式识别与机器学习》-马春鹏

支持向量机

解决的问题

1、分类问题
2、回归问题
3、异常点检测问题

最大边缘分类器

  边缘:决策边界于最近的数据点之间的垂直距离
  最大化边缘会产生对决策边界的一个特定的选择。
线性模型的形式为:
$$
y(x) = w^T\phi(x)+b
$$
其中$\phi(x)$表示一个固定的特征空间变换。
点$x$距离$y(x) = 0$定义的超平面的垂直距离为$\frac{|y(x)|}{\||w\||}$,其中$y(x)$的函数形式由线性模型形式给出,我们只感兴趣能狗正确分类所有数据点的解,即对于所有的$n$都有$t_ny(x_n)>0$,因此点$x_n$距离决策面的距离为
$$
\frac{t_ny(x_n)}{||w||}=\frac{t_n(w^T\phi(x_n))+b}{||w||}
$$
边缘由数据集里垂直距离最近的点$x_n$给出,我们希望最优化参数$w$和$b$,使得整个距离能够最大化。因此,最大化边缘可以通过下式得到:
$$
arg max_{w,b}\{\frac{1}{||w||}\min[t_n(w^T\phi(x_n)+b)]\}
$$
直接求解太复杂,转换为更容易等价求解的等价问题,为了完成这件事,我们注意到如果我们进行重新标度$w->kw$以及$b->kb$,那么任意点$x_n$距离决策面的距离$\frac{t_ny(x_n)}{||w||}$不会发生改变。我们可以使用整个性质,对于决策面最近的点,令
$$
t_n(w^T\phi(x_n)+b) = 1
$$
所以所有的数据点都会满足:
$$
t(w^T\phi(x_n)+b)\geq1,n=1,\cdots,N
$$
这就是决策超平面的标准表示。对于使上式取等号的点,我们说限制被激活点,对于其他点,我们说限制未激活点。由定义可得,总会存在至少一个激活限制,即总会有一个距离最近的点,并且一旦边缘被最大化,会至少由两个激活的限制。这样,最优化问题就简化为了最大化$||w||^{-1}$,这等价于$||w||^2$,因此我们要在限制条件下求解最优化问题
$$
arg min_{w,b}\frac{1}{2}||w||^2
$$
引入$\frac{1}{2}$是为后续计算方便。这是一个二次规划问题,我们试图在一组线性不等式的限制条件下最小化二次函数。似乎偏执$b$从最优化问题中消失了。实际上,它可以通过限制条件的隐式地确定,$||W||$的改变需要通过$b$的改变进行补偿。为了解决找个问题,我们引入拉格朗日乘数$a_n\geq0$。从而得到下式:
$$
L(w,b,a) = \frac{1}{2}||w||^2-sum_{n=1}^{N}{a_n\{t_n(w^T\phi(x_n)+b)-1\}}
$$
其中$a=(a_1,...,a_N)^T$,这里注意拉格朗日乘项前面的负号,是因为我们要求$w$和$b$最小化,关于$a$最大化。令$L(w,b,a)$关于$w$和$b$的导数等于零,我们得到了下面两个条件。
$$
w = sum_{n=1}^{N}{a_nt_n\phi(x_n)}
$$
$$
0 = sum_{n=1}^{N}{a_nt_n}
$$
这两个式子带入$L(w,b,a)$中消去$w$和$b$,就得到最大化边缘问题的对偶表示,其中我们要使得$a$最大化:
$$
L(a) = sum_{n=1}^{N}{a_n} - \frac{1}{2}sum_{n=1}^{N}{sum_{m=1}{N}{a_na_mt_nt_mk(x_n,x_m)}}
$$
限制条件为
$$
a_n\geq0,n=1,...,N
$$
$$
sum_{n=1}^{N}{a_nt_n} = 0
$$
和函数被定义为$k(x,x') = \phi(x)^T\phi(x')$。这里仍是二次规划问题,不等式约束条件下最优化$a$的二次函数。
将(8)(9)公式代入公式(1)消去$w$,$y(x)$可以根据参数$\{a_n\}$和核函数表示,即
$$
y(x) = sum_{n=1}^{N}a_nt_nk(x,x_n)+b
$$
这种形式的限制的最优化问题满足Karush-Kuhn_Tucker(KKT)条件,满足如下:
$$
a_n \geq 0
$$
$$
t_ny(x_n)-1 \geq 0
$$
$$
a_n\{t_ny(x_n)-1\} = 0
$$
因此对每个数据点,要么$a_n=0$,要么$t_ny(x_n)=1$。<u>**任何使得$a_n=0$的数据点都不会出现在$y(x) = sum_{n=1}^{N}a_nt_nk(x,x_n)+b$的求和式中,因此对新数据点的预测没有作用。剩下的数据点被称为支持向量(support vector)**。</u>由于这些支持向量满足$t_ny(x_n)=1$,因此它门对应于特征空间中位于最大超平面内的点。这个性质是支持向量机在实际应用中的核心,一旦模型被训练完毕,相当多的数据点都可以被丢弃,只有支持向量被保留。
解决了二次规划问题找到最优$a$的值之后,注意到支持向量$x_n$满足$t_ny(x_n)=1$,我们可以确定阈值参数$b$的值。由公式(13)可得:smile:
$$
t_n(sum_{m\in S}{a_mt_mk(x_n,x_m)+b})=1
$$
其中$S$表示支持向量的下标集合。虽然我们可以使用任意选择的支持向量$x_n$解这个关于$b$的方程,但是我们可以通过下面的方式得到一个在数据计算上更加稳定的解。首先乘以$t_n$,使用$t_n^2 = 1$的性质,整理的
$$
b = \frac{1}{N_s}sum_{n\in S}({t_n - sum_{m\in S}{a_mt_mk(x_n,x_m)}})
$$
其中$N_s$是支持向量的总数。

svm稀疏性的来源

最大边缘超平面由支持向量的位置定义,其他数据点可以自由移动(只要仍然在边缘区域之外)而不改变决策边界,因此解与这些数据点无关。

实战

 1 from sklearn import svm
 2 import numpy as np
 3 from tensorflow.examples.tutorials.mnist import input_data
 4 mnist = input_data.read_data_sets('MNIST_data',one_hot=False)
 5 train_num = 10000
 6 test_num = 1000
 7 x_train = mnist.train.images
 8 y_train = mnist.train.labels
 9 x_test = mnist.test.images
10 y_test = mnist.test.labels
11 predictor = svm.SVC(gamma='scale',C=1.0,decision_function_shape = 'ovr',kernel='rbf')
12 predictor.fit(x_train[:train_num],y_train[:train_num])
13 result = predictor.predict(x_test[:test_num])
14 accurancy = np.sum(np.equal(result,y_test[:test_num])) / test_num
15 print(accurancy)

 

 

参数

SVC *class* `sklearn.svm.``SVC`(*C=1.0*, *kernel='rbf'*, *degree=3*, *gamma='auto'*, *coef0=0.0*, *shrinking=True*, *probability=False*, *tol=0.001*, *cache_size=200*, *class_weight=None*, *verbose=False*, *max_iter=-1*, *decision_function_shape='ovr'*, *random_state=None*)

 

  • c:惩罚系数,用于控制损失函数的惩罚系数,类似于LR中的正则化系数。c越小对误分类的惩罚减少,容错能力增强,泛化能力较强,但也可能欠拟合;c越大越趋向于对训练样本全分对的情况,这样会出现过拟合情况,泛化能力弱。
  • kernel:核函数的类型,核函数是将非线性问题转化为线性问题的一种方法,主要有RBF、Linear、Poly、Sigmoid或者自定义核函数。模型为RBF(高斯核或径向基核),Linear线性核,Poly是多项式核,Sigmoid是双曲正切函数tanh核。
  • degree:只对Poly有用,表示多项式核的最高次数,默认三次多项式。
  • gamma:核函数系数,RBF、Poly核Sigmoid的内核系数;默认‘auto',那么将会使用特征位数的倒数,及1/n_features。gamma越大$\sigma$越小,使得高斯分布高瘦,造成模型只能作用于支持向量附近,可能导致过拟合;反之,gamma越小,$\sigma$高斯分布矮胖,在训练集上分类效果不佳,可能导致欠拟合。
  • coef0:和函数常熟值$y=kx+b$的$b$值,只有’poly‘和‘sigmoid'核函数有,默认为0。
  • shrinking:是否进行启发式。如果能预知哪些变量对应着支持向量,则只要在这些样本上训练就够了,其他样本可不予考虑,这不影响训练结果,但降低了问题的规模并有助于迅速求解。进一步,如果能预知哪些变量在边界上(即a=C),则这些变量可保持不动,只对其他变量进行优化,从而使问题的规模更小,训练时间大大降低。这就是Shrinking技术。 Shrinking技术基于这样一个事实:支持向量只占训练样本的少部分,并且大多数支持向量的拉格朗日乘子等于C。
  • probability:是否使用概率估计,默认为False。必须在fit()方法前使用,该方法会降低运算速度。
  • tol:残差收敛条件,默认为0.0001,即容忍1000分类里出现一个错误,于LR中的一致,误差项达到指定值时则停止训练。
  • verbose:是否启用详细输出。在训练数据完成之后,会把训练的详细信息全部输出打印出来,可以看到训练了多少步,训练的目标值是多少;但是在多线程环境下,由于多个线程会导致线程变量通信有困难,因此verbose选项的值就是出错,所以多线程下不要使用该参数。

参考:

https://blog.csdn.net/qq_35170267/article/details/84290367

 

 
posted @ 2020-01-02 17:18  爱吃帮帮糖  阅读(286)  评论(0编辑  收藏  举报