前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【分类战车SVM】附录:用Python做SVM模型

【分类战车SVM】附录:用Python做SVM模型

作者头像
数说君
发布2018-04-08 11:47:32
1K0
发布2018-04-08 11:47:32
举报
文章被收录于专栏:数说工作室数说工作室

本集目录为:

一、简化版SMO算法

二、LIBSVM包

1.简介

2.数据格式

3.安装

4.简单的使用方法

三、题外话

上一集介绍了SMO的算法原理,本集是《分类战车SVM》系列的最后一个,介绍如何用代码实现,给出了简化版的SMO代码,以及LIBSVM的使用方法。

前面6集可以在微信公众号“数说工作室”(搜不到就搜微信号“shushuojun”)中回复“SVM1”(开题话)、“SVM2”(线性分类)、“SVM3”(最大间隔分类器)、“SVM4”(拉格朗日对偶问题)、“SVM5”(核函数)、“SVM6”(SMO算法)来查看。

一首诗,送给我生命中的“最优参”:

KKT条件,

像绵延起伏的万水千山

隔断了我的视线,

却隔不断我对远方的期盼,

少年傲然,曾经,要追寻生命的最优参;

我倚核函数之剑迭代循环,

穿过水榭,越过山峦,

到达SMO算法的彼端,

人生暮然,原来,你才是我人生的最优参。

——数说君


一、简化版SMO算法

此段代码来自于《Machine Learningin Action》这本书。这本书的作者不建议去读SVM的产品级C++代码,因为很难读懂,但把产品级代码和速度提升部分剥离出去,那么只剩下SVM核心思想,这样的代码就很容易读懂了。

首先写三个函数:导入数据的函数、随机数函数、门限函数:

接着,才是简化版的SMO代码(这些代码,为方便在微信中看,我用图的形式展现,如果想要文字版的源码,在微信号“shushuojun”中回复“简化版SVM”即可)

  • 解释(1)

我们还记得f(xi)的公式吧,

故有,

而,

因此,

  • 解释(2)

这个if语句是干嘛的?关于这个代码,一定会有同学有疑惑。其实,这个语句是判断a是否满足KKT条件的,如果不满足KKT条件,说明不是最优的,可以继续优化。如果满足了,则已经是最优的了.

那么什么是KKT条件?

这个我在第四话(微信号shushuojun中回复“SVM4”查看)就卖了一个关子,考虑到这个东东不是很重要(其实我们在一路的推导中也没有太用到这个定理),因此我就在这里直接给出来:

Ei=f(xi)-yi,我们把f(xi)=Ei+yi代入到KKT条件中去,那么KKT条件等价于:

因此,我们可以用如下的条件来筛选出不符合KKT条件的a:

把这个写成代码,就是:

(labelMat[i]*Ei < -toler) and (alphas[i] < C)

Or

(labelMat[i]*Ei > toler) and (alphas[i] > 0)

即,

If ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or((labelMat[i]*Ei > toler) and (alphas[i] > 0))

那么就不满足KKT条件了。

还有人会问,为毛代码中只筛选不满足条件的ai,aj怎么不筛选?

因为有一个叫Osuna的定理告诉我们,只要选择出来的两个a中,有一个违背了KKT条件,那么目标函数在进一步迭代的时候就会减小,迭代就有意义。

  • 解释(3)

这个eta是什么鬼?

第六话中我们说到(在微信号shushuojun中回复“SVM6”),

这个eta其实就是下面分母的2K12-K11-K22。

a1和a2换成ai和aj,那么eta就是2Kij-Kii-Kjj,就是上面的代码了。不信,你看:

  • 解释(4)

对于第一次优化的两个参数a1、a2(在这里是ai、aj),第六话中我们给出了a2的迭代求值公式:

那么a1的公式是什么?求出a2之后,就可以用a2来推导a1了,它的公式是:

这就是代码中的迭代公式了。

  • 解释(5)

这个其实是b的求值公式:

二、LIBSVM包

1. 简介

如果有一个功能强大、全面而且又免费的SVM包,为什么不用呢?

第二节隆重介绍这个LIBSVM包。

LIBSVM是中国台湾大学林智仁副教授开发设计的一个简单、易于使用和快速有效的SVM软件包,他不但提供了编译好的可在windows系列系统的执行文件,还提供了源代码,方便改进、修改以及在其他操作系统上应用。

2.数据格式

LIBSVM使用的训练数据和检验数据文件格式如下:

<label> <index1>:<value1> <index2>:<value2>…

这里label相当于y,即类别变量。Index是自变量的索引号,value就是自变量,举个例子就明白了:

写成LIBSVM格式就应该是:

这个过程同学们可以自己在excel中编写代码来完成,也可以使用FormatDataLibsvm.xls,网上可以下载到。

3. 安装

LIBSVM的官方主页是:

http://www.csie.ntu.edu.tw/~cjlin/libsvm/

点击末尾的“阅读原文”可以看到。

如何安装?以下摘自网络,数说君反正找了一台32位的系统,安装上了,64位的同学自己摸索摸索吧:


1)从python官网上下载windows下的安装包python-2.7.3.msi并安装 2)打开IDLE(pythonGUI),输入 >>>import sys >>>sys.version 如果你的python是32位,将出现如下字符: ‘2.7.3 (default, Apr 102012, 23:31:26) [MSC v.1500 32 bit (Intel)]’ 这个时候LIBSVM的python接口设置将非常简单。在libsvm-3.16文件夹下的windows文件夹中找到动态链接库libsvm.dll,将其添加到系统目录,如`C:\WINDOWS\system32\’,即可在python中使用libsvm 3)如果你的python是64位的,也就是说打开IDLE(pythonGUI),输入 >>>import sys >>>sys.version 出现如下字符: '2.7.3 (default, Apr 10 2012, 23:24:47) [MSCv.1500 64 bit (AMD64)]' 这时你需要首先自己编译64位的动态链接库libsvm.dll。方法如下: 在程序列表中的Microsoft VisualStudio 2010/Visual Studio Tools下找到Visual Studiox64 Win64 Command Prompt(2010),注意一定要是64位的command prompt cd到LIBSVM所在文件夹libsvm-3.16 输入nmake -f Makefile.winclean all 这时libsvm-3.16的windows目录下将生成64位的动态链接库。将新生成的libsvm.dll复制到系统目录(例如`C:\WINDOWS\system32\')即可。


4. 简单的使用方法

数说君以一个例子,简单说一下如何训练和预测,其中的参数调整和更深的优化,自己去网上找资料,或者看作者的guide吧。

如果有同学自己成立了一个比较好的文档,欢迎给数说君投稿,跟2万名数据分析爱好者们分享哦~

现在有如下100条数据:

(1)定位

该数据名为testSet,在c:\python路径下,因此我们首先定位:

>>>import os

>>>os.chdir(‘c:\python’)

(2)读取

我们用svm_read_problem来读取这个数据。

>>>y,x=svm_read_problem(‘testSet.txt’)

(3)训练模型

我们用数据的前50条做训练样本,后50样本作为预测样本,来看预测准确性。首先训练模型:

>>>model=svm_train( y[:50], x[:50] )

(4)预测

用训练出来的模型mode来预测:

>>>svm_predict( y[50:], x[50:], model)

结果显示:

Accurary=96% (48 / 50) (classification)

预测的准确性达到了96%。

我们再重新做一遍,这次前80条数据作为训练数据、后面20条数据作为预测数据:

>>>model=svm_train( y[:80], x[:80] )

>>>svm_predict( y[80:], x[80:], model)

Accurary=100% (20 / 20) (classification)

这次正确率是100%了。

三、题外话

至此,“分类战车SVM”系列就完结了,各位同学有补充、修改的可以给数说君投稿,或者其他数据分析相关的干货都可以。另外感谢一下微博用户@当局者清(http://weibo.com/weishengkui)同学指出了第六话中的一些错误(详见http://weibo.com/1744228463/CaxTnfcMA?type=comment下面的评论)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数说工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、简化版SMO算法
  • 二、LIBSVM包
    • 1. 简介
      • 2.数据格式
        • 3. 安装
          • 4. 简单的使用方法
          • 三、题外话
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档