Hard-Margin SVM
Linear SVM
如果说 在平面上 0的点 和 1的点 是可分的 那就能找出无数条线 来划分这个面
那怎么找到最好的线 这就是svm做的事 就是找到最不容易发生意外的线
就像这3条线 第1条就很容易发生意外 就是说 在左边的 x 这个地方 对分类要求的精度很高 可能一不小心就分错了 x o
而 svm 就是要找到 第3条线这样的线 在svm中 越不容易出意外 越好
什么叫不出意外 就是不轻易落在错的地方 就是 每个点都不要离线太近 那就是 求
max (all点 到线的距离)
这边 点到线的距离是最短距离就是垂直距离
表现成数学公式 就是个最优化方程
distance 基本的数学公式
其中 :
wTx′+b=0
把 0,1标签加上 方程就变成了
用一个技巧
min1||w||yn(wTxn+b)
那可以把他固定到一个数 1 就是
1||w||yn(wTxn+b)=1
这是不会影响最后结果的 因为 b 和 w 都是未知数 对原来的min值 只要 b w都 变成
bminwmin
就是 1值了 那么 方程就变成了
再转换成熟悉的最优化 min
这就是qp问题
这个过程中 有个挺坑的地方 就是你光看着过程 会发现 max好像都是取到最远的点 ,但其实不是 。svm 中的support vector 是指支撑那条线的 点 ,max是看这些support vector 的距离
Dual SVM
这边的 Zn 可能就会出现问题了 Zn 的维度可能会太高了 太高维的Zn 会对计算带来麻烦
处理这个问题 可以用上一个小技巧 lagrange multiplier (拉格朗日乘子法 ) 简单说 就是个 方程 加个新参数 λ。 在SVM 中 λ 一般写成α
对 违规的 α x (正数) 就是 无穷 可以被排除
所以
下面是 另一个小技巧
交换 max min 结果不变
SVM=minb,w(maxallan>0L(b,w,a))=maxallan>0(minb,wL(b,w,a))
就是逻辑推理吧
左边 >= 右边 容易看出
右边 >= 左边 需要 是凸函数 线性条件
方程转化成了这样 就对 b w 分别求导 很容易的
∂L(b,w,a)∂b=0=−∑Nn=1αnyn
∂L(b,w,a)∂w=0=w−∑Nn=1αnynzn
方程就变成了
还有这么多的约束条件
最下面那个条件又叫 kt条件就是是互补松弛 就2个里面最少满足一个
经过一连串数学处理 就把 条件从 Z的维度 减下到了 N 维度
但是还不不够 虽然条件是N维度了 但 Z这个大维度 跑到了 最优方程
zTnzm
这里 这个对计算也是个麻烦
引出下面的 kernel 技巧
Kernel SVM
ϕ(xn)Tϕ(xM)=zTnzm
举个例子
ϕ2
这就是把
ϕ2
分成了 3部分 每个部分对应相乘 刚好出现了这样的结果 挺神奇的
而这个就是 kernel技巧 此时的
ϕ(xn)Tϕ(xM)
就可以用x来计算出来 。 就不用去管 z里面的高维度了 ,
然后 b,w 都可以根据这个技巧 简化计算
(上述的kernel 和dual 中的 lagrange参数 都是为了 避开 z 中的高维度)
现在就可以对 poly-2 做kernel的技巧
实际效果图
更高次的也是同样的kernel技巧
那如果是 无限维呢
无限维也可以办到 我们知道
ex=xnn!
这个里面就出现了无限维 ,那就把 K(xn,xm)使劲往这边靠
那就是要出现
exnxm
刚好
e−(xn−xm)2
办到了这个
这样 无限维 也可以被 N维所表示 给算出来了
这样我们就把 Zn 这个高维度给丢掉了 让SVM这个好用的分类计算也方便了 还收获了 Gaussian 这个无限维的 不管边界再奇怪 Gaussian也能解决
但还有一个 地方 : 就是前面的是 Hard-Margin 必须把 0,1完美分开 ,但实际上 好多的是错误信息,对错误信息的刻意处理 容易让你overfitting
举个例子
Soft-Margin SVM
和前面的最优化方程比 多加了一项
C∑Nn=1ξn
这项也叫惩罚项,就是现在允许分类犯错了 但你犯错 我还是要惩罚你 惩罚的力度 就和我设的C 和你的表现ξ相关
下面就来解这个方程 同样用上 lagrange 这个技巧
同样 对
ξ,α,β
求导 很简单的
好了 这边就看出来了 ξ这个条件可以丢弃了 变成了
0<α<C
对 a
有了更高的要求
问题就变成了这样,一看 和上面的一模一样 就是对 a 有了要求
那上面的 kernel 技巧也可以用上去 Soft-SVM 这个问题就解决了
看看 它的表现怎么样
恩 确实不错 对一些错误的不处理 反而比处理它更好
综上所述 从最简单的svm慢慢深入,可以发现,确实svm效果很好,而且有Soft-Margin,对overfit也能有较好的控制。这其中 kernel占了很大的原因 kernel 让 计算 从高维度 下降到了 N维,可以看出简单的数学技巧的巨大作用
代码
#Import Library
from sklearn import svm
#X,y training dataset ,x_test test datasetet
# 建立svm模型
model = svm.svc()
# there is various option associated with it, this is simple for classification. You can refer link, for more detail.
model.fit(X, y)
model.score(X, y)
predicted= model.predict(x_test)