前几天写了一下自己对SVM中关键的距离问题的理解,后面会继续记录自己对该模型其他问题的理解,今天想试试SVM在“西瓜书”那个“阿尔法3.0”数据集上的效果。于是查到了“湾湾”教授林智仁先生大牛等写的一个开源包LibSVM,并且该library可以与很多平台兼容,有很多语言版本,支持java 、C++、C 、MATLAB等,我们可以在林教授主页上下载。LibSVM地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/,Windows平台下载Zip压缩文件,Linux下则是tar.gz,新版的包为3.x。本人MATLAB开发平台的版本号为Windows下的R2016a,因此,记录R2016a集成该开源包的过程。
首先,我搜到了faruto大佬在matlabsky发的一个关于该问题的帖子,于是就按照该帖子的叙述进行相关的操作,不过踩到了好几个坑,因为这个帖子是好久之前的,版本比较靠前,所以会有些细节上的不同,不过大致还是可以参考的。而且也有视频的讲解可以参考。
原贴地址:http://www.matlabsky.com/thread-11925-1-1.html
优酷视频:http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html
Step1:添加LibSVM的搜索目录(路径)
点击主页选项卡下的“设置路径”按钮---->点击“添加并包含子文件夹”---->点击“libsvm-3.22”文件夹,选择所在的目录 ---->保存&关闭
Step2:安装C++编译器
帖子中先是运行mex -setup,按照提示进行选择,但是我在安装了VC6.0的前后,运行该命令都会报错:“未安装编译器或者SDK”,也就是安装了VC也找不到,我猜测可能是VC太旧。所以换了GCC, 由于开发包是C++开发的,所以需要相关的编译器进行编译后,MATLAB才能够调用。由于新版本的MATLAB支持MinGW(GCC)编译器,而且相对比较小巧,故我选择了安装该编译器(也可以安装VS201X),安装路径最好是“X:\TDM-GCC-64”这种形式,“X”是盘符下载地址:http://tdm-gcc.tdragon.net/download,或者下载网盘数据,链接:http://pan.baidu.com/s/1cMwao2 密码:xh9u 。安装完成后再运行命令“mex -setup”,依然提示错误,该问题可能是GCC的path设置有问题,选择调用setenv(‘MW_MINGW64_LOC‘,folder)函数进行设置,其中folder为GCC的路径,例如:setenv(‘MW_MINGW64_LOC‘,‘D:\TDM-GCC-64‘) ;运行该命令后再mex -setup ,OK,可以!
Step3:make.m编译相关的C++文件(主要是train和predict源文件)
紧随Step2,选择当前目录为Libsvm,然后运行make脚本(当前目录设置为Libsvm是防止MATLAB中有与make同名的脚本),本以为已经成功集成,谁料依然出错“No such file or directory......”,实在是有一种fuck dog的感觉,继续填坑,查阅其他博客,幸好有人遇到过同样的问题,make脚本文件中将配置MATLAB对应的代码行进行修改,具体将“CFLAGS”修改为“COMPFLAGS”可以用ctr+F然后点击全部替换可以更快。完成以上操作之后,再运行make脚本函数,成功运行,在当前文件夹(../Libsvm/matlab)中,会发现多了两个train和predict的.obj文件这是编译之后的结果,表示成功。
Step4:测试libsvm环境
在libsvm2.x中,是有heart_scale.mat数据文件但是最新的libsvm3.x只有heart_scale纯文本文件,这是C++数据数据文件的格式,如果按照faruto视频中的操作,键入“load heart_scale”命令,会发现,结果出错,这是由于缺少对应的MATLAB的数据格式的文件,因此需要用libsvmread命令进行读入,该命令其实是运行一个lib中的libsvmread.c的C文件,用于对数据的转换,其调用格式为libsvmread(‘filename’) ;例如[label_vector, instance_matrix] = libsvmread(‘heart_scale‘);此处用的当前路径,不知道可不可以用绝对路径,可以试试,应该是可以的。数据经过转换后,可以发现,多了两个数据,label_vector和instance,分别是样本标签和属性,有了数据,下面就对环境进行正式测试。调用model = svmtrain(label_vector, instance_matrix) ;生成训练模型后在调用svmpredict(label_vector, instance_matrix, model, ‘q‘),得到结果。我用周教授《机器学习》上的西瓜数据集α3.0进行环境测试,得到结果如图所示:
虽然结果很差,但是环境是搭建好了的,测试成功,因为我并没有分训练集和测试集,而且数据只有18条左右,所以这结果没啥意义,我就只是单纯测试环境是否搭建好,仅此而已。