机器学习第七周笔记 支持向量机

2017-09-19  本文已影响63人  cnzhanhao

原创性(非组合)的具有明显直观几何意义的分类算法,具有较高的准确率
源于Vapnik和Chervonenkis关于统计学习的早期工作(1971年),第一篇有关论文由Boser、Guyon、Vapnik发表在1992年(参考文档见韩家炜书9.10节)
思想直观,但细节异常复杂,内容涉及凸分析算法,核函数,神经网络等高深的领域,几乎可以写成单独的大部头与著。大部分非与业人士会觉得难以理解。
某名人评论:SVM是让应用数学家真正得到应用的一种算法

思路


简单情况,线性可分,把问题转化为一个凸优化问题,可以用拉格朗日乘子法简化,然后用既有的算法解决
复杂情况,线性不可分,用映射函数将样本投射到高维空间,使其变成线性可分的情形。利用核函数来减少高维度计算量

Paste_Image.png Paste_Image.png Paste_Image.png

背景:拉格朗日乘子法的几何解释

Paste_Image.png Paste_Image.png

关于支持向量机:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/18/2034566.html
关于拉格朗日乘子法:http://blog.csdn.net/xianlingmao/article/details/7919597
关于KKT条件:http://hi.baidu.com/grandyang/item/94cd68dfdc06941e21e25099
求解凸优化问题的斱法:http://wenku.baidu.com/link?url=Qwc1n8RL8GVzi0Bk_KKsru0rvm-TgyOUQvWZtrBEQVjbmrn0rNfv-SAcJgBgZ8kkx0wl9r5IC5rvEYs44fQ0p_L-KExJtvVTS3Uj4S68UpG

Paste_Image.png Paste_Image.png

线性不可分的情形


大部分情况都丌是线性可分的
线性丌可分时无法使用前述数学技巧
也可以使用加惩罚函数的斱法解决:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/18/2034566.html

公式中蓝色的部分为在线性可分问题的基础上加上的惩罚函数部分,当xi在正确一边的时候,ε=0,R为全部的点的数目,C是一个由用户去指定的系数,表示对分错的点加入多少的惩罚,当C徆大的时候,分错的点就会更少,但是过拟合的情况可能会比较严重,当C很小的时候,分错的点可能会徆多,不过可能由此得到的模型也会丌太正确,所以如何选择C是有很多学问的,不过在大部分情况下就是通过经验尝试得到的。

Paste_Image.png Paste_Image.png

Sequential minimal optimization
Microsoft Research的JohnC. Platt在1998年提出
最快的二次觃划优化算法
针对线性SVM和数据稀疏时性能更优

原始论文《Sequential Minimal Optimization A Fast Algorithm for Training Support Vector Machines》
http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html

算法基本思路

Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png

R

data(iris)
attach(iris)
## classification mode
# default with factor response:
model <-svm(Species ~ ., data = iris)
# alternatively the traditional interface:
x <-subset(iris, select = -Species)
y <-Species
model <-svm(x, y)
print(model)
summary(model)
# test with train data
pred<-predict(model, x)
# (same as:)
pred<-fitted(model)
# Check accuracy:
table(pred, y)
# compute decision values and probabilities:
pred<-predict(model, x, decision.values= TRUE)
attr(pred, "decision.values")[1:4,]
# visualize (classes by color, SV by crosses):
plot(cmdscale(dist(iris[,-5])),
col= as.integer(iris[,5]),
pch= c("o","+")[1:150 %in% model$index+ 1])
上一篇下一篇

猜你喜欢

热点阅读