SVM 支持向量机
代价函数
在逻辑回归中,我们的代价为:
$$\cos t({h_\theta }(x),y) = \left{ {\begin{array}{c} { - \log ({h_\theta }(x))} \ { - \log (1 - {h_\theta }(x))} \end{array} \begin{array}{c} {y = 1} \ {y = 0} \end{array} } \right.$$ ,
其中: $${h_\theta }({\text{z}}) = \frac{1}{{1 + {e^{ - z}}}}$$ , $$z = {\theta ^T}x$$
如图所示,如果 y=1
,cost
代价函数如图所示
我们想让 $${\theta ^T}x > > 0$$ ,即z>>0
,这样的话cost
代价函数才会趋于最小(这是我们想要的),所以用途中红色的函数 $$\cos {t_1}(z)$$ 代替逻辑回归中的cost
当 y=0
时同样,用 $$\cos {t_0}(z)$$ 代替
最终得到的代价函数为:
$$J(\theta ) = C\sum\limits_{i = 1}^m {[{y^{(i)}}\cos {t_1}({\theta ^T}{x^{(i)}}) + (1 - {y^{(i)}})\cos {t_0}({\theta ^T}{x^{(i)}})} ] + \frac{1}{2}\sum\limits_{j = 1}^{\text{n}} {\theta _j^2} $$
最后我们想要 $$\mathop {\min }\limits_\theta J(\theta )$$
之前我们逻辑回归中的代价函数为:
$$J(\theta ) = - \frac{1}{m}\sum\limits_{i = 1}^m {[{y^{(i)}}\log ({h_\theta }({x^{(i)}}) + (1 - } {y^{(i)}})\log (1 - {h_\theta }({x^{(i)}})] + \frac{\lambda }{{2m}}\sum\limits_{j = 1}^n {\theta _j^2} $$,可以认为这里的 $$C = \frac{m}{\lambda }$$ ,只是表达形式问题,这里C
的值越大,SVM的决策边界的margin
也越大,下面会说明
2、Large Margin
如下图所示,SVM 分类会使用最大的 margin
将其分开
先说一下向量内积
$$u = \left[ {\begin{array}{c} {{u_1}} \ {{u_2}} \end{array} } \right]$$ , $$v = \left[ {\begin{array}{c} {{v_1}} \ {{v_2}} \end{array} } \right]$$
$$||u||$$ 表示u
的欧几里得范数(欧式范数), $$||u||{\text{ = }}\sqrt {{\text{u}}_1^2 + u_2^2} $$
向量V
在向量u
上的投影的长度记为p
,则:向量内积:
$${{\text{u}}^T}v = p||u|| = {u_1}{v_1} + {u_2}{v_2}$$
根据向量夹角公式推导一下即可, $$\cos \theta = \frac{{\overrightarrow {\text{u}} \overrightarrow v }}{{|\overrightarrow {\text{u}} ||\overrightarrow v |}}$$
前面说过,当 C
越大时,margin
也就越大,我们的目的是最小化代价函数 J(θ)
,当 margin
最大时,C
的乘积项 $$\sum\limits_{i = 1}^m {[{y^{(i)}}\cos {t_1}({\theta ^T}{x^{(i)}}) + (1 - {y^{(i)}})\cos {t_0}({\theta ^T}{x^{(i)}})} ]$$ 要很小,所以近似为:
$$J(\theta ) = C0 + \frac{1}{2}\sum\limits_{j = 1}^{\text{n}} {\theta j^2} = \frac{1}{2}\sum\limits{j = 1}^{\text{n}} {\theta _j^2} = \frac{1}{2}(\theta _1^2 + \theta _2^2) = \frac{1}{2}{\sqrt {\theta _1^2 + \theta _2^2} ^2}$$ ,我们最后的目的就是求使代价最小的θ
由 $$\left{ {\begin{array}{c} {{\theta ^T}{x^{(i)}} \geqslant 1} \ {{\theta ^T}{x^{(i)}} \leqslant - 1} \end{array} } \right.\begin{array}{c} {({y^{(i)}} = 1)} \ {({y^{(i)}} = 0)} \end{array} $$ 可以得到:$$\left{ {\begin{array}{c} {{p^{(i)}}||\theta || \geqslant 1} \ {{p^{(i)}}||\theta || \leqslant - 1} \end{array} } \right.\begin{array}{c} {({y^{(i)}} = 1)} \ {({y^{(i)}} = 0)} \end{array} $$ ,p
即为x
在θ
上的投影
如下图所示,假设决策边界如图,找其中的一个点,到θ
上的投影为p
,则 $$p||\theta || \geqslant 1$$ 或者 $$p||\theta || \leqslant - 1$$ ,若是p
很小,则需要 $$||\theta ||$$ 很大,这与我们要求的θ
使 $$||\theta || = \frac{1}{2}\sqrt {\theta _1^2 + \theta _2^2} $$ 最小相违背,所以最后求的是 large margin
3、SVM Kernel(核函数)
对于线性可分的问题,使用线性核函数即可
对于线性不可分的问题,在逻辑回归中,我们是将feature
映射为使用多项式的形式 $$1 + {x_1} + {x_2} + x_1^2 + {x_1}{x_2} + x_2^2$$ ,SVM
中也有多项式核函数,但是更常用的是高斯核函数,也称为RBF核
高斯核函数为: $$f(x) = {e^{ - \frac{{||x - u|{|^2}}}{{2{\sigma ^2}}}}}$$,假设如图几个点,
令:
$${f_1} = similarity(x,{l^{(1)}}) = {e^{ - \frac{{||x - {l^{(1)}}|{|^2}}}{{2{\sigma ^2}}}}}$$
$${f_2} = similarity(x,{l^{(2)}}) = {e^{ - \frac{{||x - {l^{(2)}}|{|^2}}}{{2{\sigma ^2}}}}}$$ . . .
可以看出,若是x
与 $${l^{(1)}}$$ 距离较近,==》 $${f_1} \approx {e^0} = 1$$ ,(即相似度较大)
若是x
与 $${l^{(1)}}$$ 距离较远,==》 $${f_2} \approx {e^{ - \infty }} = 0$$ ,(即相似度较低)
高斯核函数的σ
越小,f
下降的越快
如何选择初始的 $${l^{(1)}}{l^{(2)}}{l^{(3)}}...$$
训练集: $$(({x^{(1)}},{y^{(1)}}),({x^{(2)}},{y^{(2)}}),...({x^{(m)}},{y^{(m)}}))$$
选择: $${l^{(1)}} = {x^{(1)}},{l^{(2)}} = {x^{(2)}}...{l^{(m)}} = {x^{(m)}}$$
对于给出的x
,计算f
,令: $$f_0^{(i)} = 1$$ 所以: $${f^{(i)}} \in {R^{m + 1}}$$
最小化J
求出θ
,
$$J(\theta ) = C\sum\limits_{i = 1}^m {[{y^{(i)}}\cos {t_1}({\theta ^T}{f^{(i)}}) + (1 - {y^{(i)}})\cos {t_0}({\theta ^T}{f^{(i)}})} ] + \frac{1}{2}\sum\limits_{j = 1}^{\text{n}} {\theta _j^2} $$
如果 $${\theta ^T}f \geqslant 0$$ ,==》预测y=1
4、使用 scikit-learn
中的 SVM
模型代码
线性可分的,指定核函数为 linear
:
'''data1——线性分类'''
data1 = spio.loadmat('data1.mat')
X = data1['X']
y = data1['y']
y = np.ravel(y)
plot_data(X,y)
model = svm.SVC(C=1.0,kernel='linear').fit(X,y) # 指定核函数为线性核函数
非线性可分的,默认核函数为 rbf
'''data2——非线性分类'''
data2 = spio.loadmat('data2.mat')
X = data2['X']
y = data2['y']
y = np.ravel(y)
plt = plot_data(X,y)
plt.show()
model = svm.SVC(gamma=100).fit(X,y) # gamma为核函数的系数,值越大拟合的越好
5、运行结果
线性可分的决策边界:
线性不可分的决策边界:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
{{ commentTitle }}