支持向量机(Support Vector Machine),是另外一个种监督学习算法,有时他更高效和强大。算法
回顾在逻辑回归中,咱们使用以下规则:数组
若是y=1
,那么$ h_\theta(x) \approx 1 $,进而$ Θ^Tx \gg 0 $
若是y=0
,那么$ h_\theta(x) \approx 0 $,进而$ Θ^Tx \ll 0 $app
逻辑回归的代价函数以下:函数
$$ \begin{align*}J(\theta) & = \frac{1}{m}\sum_{i=1}^m -y^{(i)} \log(h_\theta(x^{(i)})) - (1 - y^{(i)})\log(1 - h_\theta(x^{(i)}))\\ & = \frac{1}{m}\sum_{i=1}^m -y^{(i)} \log\Big(\dfrac{1}{1 + e^{-\theta^Tx^{(i)}}}\Big) - (1 - y^{(i)})\log\Big(1 - \dfrac{1}{1 + e^{-\theta^Tx^{(i)}}}\Big)\end{align*} $$学习
在SVM中,我么试图简化log
函数,成为以下紫红色的函数线,而这个函数的结果接近log
函数:优化
记$ cost_1(z) $是y=1时的代价函数,$ cost_0(z) $是y=0时的代价函数。注意到在$ cost_1(z) $中当z > 1
时,$ cost_1(z) = 0 $;在$ cost_0(z) $中当z < -1
时,$ cost_0(z) = 0 $。因而SVM的代价函数表示以下:spa
$$ J(\theta) = \frac{1}{m} \sum_{i=1}^m y^{(i)} \ \text{cost}_1(\theta^Tx^{(i)}) + (1 - y^{(i)}) \ \text{cost}_0(\theta^Tx^{(i)}) $$设计
加入正则项后:3d
$$ J(\theta) = \frac{1}{m} \sum_{i=1}^m y^{(i)} \ \text{cost}_1(\theta^Tx^{(i)}) + (1 - y^{(i)}) \ \text{cost}_0(\theta^Tx^{(i)}) + \dfrac{\lambda}{2m}\sum_{j=1}^n \Theta^2_j $$code
因为常数系数m
,并不会影响最小化代价函数,能够去掉;再记$ C = \frac{1}{λ} $,因而简化以下:
$$ J(\theta) = C\sum_{i=1}^m y^{(i)} \ \text{cost}_1(\theta^Tx^{(i)}) + (1 - y^{(i)}) \ \text{cost}_0(\theta^Tx^{(i)}) + \dfrac{1}{2}\sum_{j=1}^n \Theta^2_j $$
若是想要增大正则项的比重(即下降拟合),咱们能够减少C
;反之,经过增大C
能够防止欠拟合。
注意到,在SVM中:
若是y=1
,那么$ Θ^Tx \ge 1 $,而不是$ \ge 0 $
若是y=0
,那么$ Θ^Tx \le -1 $,而不是$ \le 0 $
如今若是咱们设置C为很是大的一个数,那么在最小化代价函数的过程当中,$ \Theta $会趋向于知足以下条件:
$$ \sum_{i=1}^m y^{(i)}\text{cost}_1(\Theta^Tx) + (1 - y^{(i)})\text{cost}_0(\Theta^Tx) = 0 $$
因而代价函数简化为:
$$ \begin{align*} J(\theta) = \frac{1}{2}\sum_{j=1}^n \Theta^2_j \end{align*} $$
同时受限于条件$ Θ^Tx \ge 1 $和$ Θ^Tx \le -1 $,将使得咱们的决策边界呈现出以下黑色实线:
上图的绿色实线看起来也是能够分割样本的,可是明显不如黑色实线好,那是由于,黑色实线距离样本的间距(margin)更大。所以,直观的看SVM是倾向于大间隔的分类器。
至于为何SVM会倾向于选择更大间距的决策边界,这跟向量投影理论有关,这里略过。
核函数帮助咱们基于SVM建立更复杂的非线性的分类器。
给定一个样本x
,把该样本跟几个参考点$ l^{(1)} $ $ l^{(2)} $ $ l^{(3)} $的类似度
做为新的特征使用。这里的类似度使用以下函数:
$$ f_i = similarity(x, l^{(i)}) = \exp(-\dfrac{||x - l^{(i)}||^2}{2\sigma^2}) $$
这个函数称为高斯核函数(Gaussian Kernal),这是核函数的一种。当x和某个l的距离很近的时候,函数结果趋向于1;反之,当x和某个l的距离很大时,趋近于0。
假设原始的x具备两个特征$ (x_1, x_2) $二维平面的点,这个点距离某个参考点的高斯核函数具备以下相似图像:
这个凸面上的点的高度就是函数的值,当$ (x_1, x_2) $接近参考点时,函数值越接近1,反正越趋向于0。
高斯核函数有个参数σ
,当σ
越大,凸面更平缓,意味着咱们对两个点距离的相近度越宽容
;当σ
越小,凸面更尖锐,意味着咱们对两个点距离的相近度越严苛
。
一种选取参考点的方法是,将每个样本都做为参考点。当样本数为m
时,参考点的数量也是m。因而对于参考点$ l^{(1)} $,需计算样本中的每个点与其类似度:
$$ f_1 = similarity(x,l^{(1)}) = \exp(-\dfrac{\sum^n_{j=1}(x_j-l^{(1)})^2}{2\sigma^2}) $$
这样咱们能够计算出一组新的样本$ f $,样本数量为m
,而后使用$ f $代替$ x $使用SVM,最小化以下代价函数:
$$ \min_{\Theta} C \sum_{i=1}^m y^{(i)}\text{cost}_1(\Theta^Tf^{(i)}) + (1 - y^{(i)})\text{cost}_0(\theta^Tf^{(i)}) + \dfrac{1}{2}\sum_{j=1}^n \Theta^2_j $$
这种经过核函数来转变样本并做用在SVM算法中的方法,也能够用于逻辑回归。不过SVM与核函数组合使用是通过优化的,所以,计算效率比其余算法要高。
若是使用高斯核函数,那么在SVM中,咱们须要调整的参数有两个:
在设计SVM的模型时,不建议本身编写SVM的实现,由于成熟的库一般效率更好。在应用SVM时,你须要做以下决策: