一、下载与安装libsvm

1.下载libsvm

下载地址:https://www.csie.ntu.edu.tw/~cjlin/libsvm/下载后的结果:对该压缩包进行解压,最好解压到matlab安装路径中的toolbox文件夹下,如下图所示:

       注意:这里是 matlab 2020b 和 libsvm 3.32 (请注意版本的差异问题,版本的不一致或许可能         会造成安装出现问题)

2.设置路径

在 matlab 2020b 中设置 libsvm 3.32 所在的路径,如图所示

1. 打开MATLAB R2020b软件,然后找到 设置路径 选项

找到libsvm路径选中后,点击保存,然后点击关闭

3.编译libsvm 3.32

将libsvm的路径添加到matlab中,需要对libsvm中的文件进行编译,因为libsvm的开源代码不是matlab,是C语言、C++写的,所以需要对其进行编译,才能在matlab中对libsvm中的文件进行调用。

1.进入libsvm 3.32中malab文件夹所在的路径下(否则会编译不成功),在命令行窗口输入命令 mex -setup,按下 Enter键 运行会得到如图所示的结果(前提是已经安装了编译器,我是之前就已经安装过MingGW64 编译器了,如果运行该指令后报错,请看关于 编译失败可能的原因 中的解决办法)

补充:mex 是一个用于编译MEX文件的MATLAB命令,将源代码编译为MEX文件,以便在MATLAB中使用。MEX文件是一种可以在MATLAB中调用的二进制可执行文件,它可以使用C、C++、Fortan等语言编写,并与MATLAB的数据和函数进行交互。

2.如果第一步顺利的话,就在命令行窗口输入 make ,然后运行。得到如下图所示的结果就是编译成功了!

3.查看matlab左侧得到目录栏是否有 后缀为.mexw64 的文件(因为我的系统是Windows  64位的,在不同的系统编译完成后出现的文件后缀名结果不同,比如:Linux 64位系统上是.mexa64)出现,如果存在,那么就完成了libsvm的编译工作。

编译失败的可能原因:

1.最常见的一点就是没有安装编译器(注意:不同系统需要安装的编译器不一样哦,这里以介绍在Windows 系统下进行编译的编译器安装)

解决办法:请参考这位博主的博客 ,博客链接:https://blog.csdn.net/github_35807147/article/details/80725642https://blog.csdn.net/github_35807147/article/details/80725642

应该可以解决问题。

2.这是我自己遇到的错误,很低级的一个错误,没有进入到matlab文件夹所在的路径下运行命令,导致出现如下的错误:

4.测试例子

进行完成第三步后,下面来测试一下是否能正常使用libsvm进行预测。

1.将libsvm 3.32文件下的测试数据集heart_scale复制粘贴到libsvm中matlab所在的文件夹下,如图所示:

2.依然是要进入到matlab路径下,此时在命令行窗口依次输入命令:

% 读取测试数据集heart_scale

[heart_scale_label,heart_scale_inst] = libsvmread('heart_scale');

% 将读取的数据送入模型中

model = svmtrain(heart_scale_label,heart_scale_inst);

% 加载数据和模型进行预测

[predict_label,accuracy,dec_values] = svmpredict(heart_scale_label,heart_scale_inst,model);

运行结果如图所示:

好了,以上就完成了下载与安装 libsvm 3.32的所有步骤了!

二、使用libsvm 3.32

1.标准格式的转换

转换标准格式需要表格FormatDataLibsvm.xls(十分感谢博主 qq:843375677 博文中的链接:https://download.csdn.net/download/qq_31781741/10660504,以及这位善良好心的博主:https://www.jianshu.com/p/8dcde06319b1)

下载这个表格后最好用 Excel 打开(这里我使用的是Excel 2016),打开后是一张空表格(如果上方提示禁用宏,记得要启用宏),随便输入一些数据(第二列是标签),并找到 宏 如图所示:

选择下拉框中的 查看宏,弹出关于宏的界面,这里选择 FormatDataToLibsvm,点击执行即可

执行后的结果如下图所示:

此时在图中第一列是标签

最后将表格另存为txt格式的文本文件,文件名称随意,选择保存的类型为: 文本文件(指标符分隔),进行保存即可。如图所示,可以得到一个文件类型为txt的demo_data的文本文件:

通过上述的运行可以看到, 使用该表格时需要运行宏(通常在编译阶段之前就被执行),输入数据时最后一列为标签,转换完成后,标签转至第一列。

2.数据归一化

1.将刚才保存的demo_data文本文件复制粘贴到libsvm-3.32下的windows文件夹中(如果一开始就保存到这个路径下就不需要执行这一步操作)

2.你可以看到在windows文件夹中有后缀为.exe的可执行文件,但是双击后都是闪退的,无法直接双击运行,需要在 Windows 操作系统中的命令行解释器,也称为命令提示符cmd中进行执行。首先按下 win+R ,再输入cmd,点击确定,如图所示:

如下图所示,需要将保存的demo_data中的数据进行归一化处理,总共有4小步:

(注意:实际情况根据自己的文件路径进行操作,下面演示的是我的情况)

1.切换到E盘,按enter键

2.需要将路径切换到libsvm-3.32中的windows文件夹所在的路径(除了手动输入,可以如图所示操作,找到要切换文件的路径,将文件拖拽到cmd命令行解释器中,就可以自动获取到要切换到的路径),按enter键

3.输入命令,对demo_data进行数据归一化处理,按enter键

注意:其中第三句命令中的  “>”  这是重定向操作符,将命令的输出重定向到指定的文件

4.这是第三步按下enter键后返回的最终结果

最终,如果对demo_data文本文件归一化处理成功后会在windows文件夹中找到demo_data_1文件,默认归一化范围 [0,1] 或 [-1,1]

如图所示:

可以打开这两个文件,对比一下内容:

3.训练以及预测

libsvm主要用于做分类、回归任务,下面以回归任务为主介绍一下训练以及预测的过程

首先将归一化得到的 demo_data_1.txt 文件复制粘贴到 ibsvm-3.32\matlab 目录下,如图所示:

在matlab所在的路径下,在命令行窗口中输入以下命令:

% 读取文件demo_data_1.txt

[ lable,im ] = libsvmread ( 'demo_data_1.txt' ) ;       

%训练模型                                 

model = svmtrain ( lable(1:5),im(1:5,:),'-s 4 -t 2 -c 1 -g 0.125' ) ;     

%预测        

[ prelabel,accuracy,decision_values ] = svmpredict (lable(6:10),im(6:10,:),model) ;             

运行后的结果如下图所示:

还可以单独将返回的是三个值 prelabel , accuracy, decision_values 进行打印输出:

我还想对刚才的三句代码进行分析:

1.读取文件

[ lable,im ] = libsvmread ( 'demo_data_1.txt' ) ;   

libsvmread函数用于从文件demo_data_1.txt中读取数据,这个文件中包含了支持向量机训练和测试所需的数据,读取后,标签lable和输入矩阵im将被赋值给相应的变量。

2.训练模型

model = svmtrain ( lable(1:5),im(1:5,:),'-s 4 -t 2 -c 1 -g 0.125' ) ; 

svmtrain 函数用于训练支持向量机模型

label(1:5)是前五个样本的标签

im(1:5,:)是前五个样本的输入矩阵

参数-s 4 表示使用epsilon-SVR模型,-t 2 表示使用径向基核函数(RBF kernel),-c 1 表示惩罚参数C的值为1,-g 0.125表示径向基核函数的gamma参数为0.125。

3.预测

[ prelabel,accuracy,decision_values ] = svmpredict (lable(6:10),im(6:10,:),model) ; 

svmpredict 函数用于对新数据进行预测

label (6:10) 是测试集中的标签

im (6:10,:) 是测试集中的输入矩阵

model 是之前训练好的支持向量机模型

预测结果将会保存在 prelabel 变量中,预测的准确度保存在 accuracy 变量中,而决策值(decision values)则保存在 decision_values 变量中

注意:这里的 label(1:5) 和 im(1:5,:) 以及 label (6:10) 和 im (6:10,:) ,是根据demo_data_1.txt文件中的数据内容来写的,不是随意写的。

以上就是libsvm做回归任务的进行训练及预测的一个简单示例,剩下的就是参数寻优的过程了。

in the end,再次感谢以上在文中提到的博主!如果对你有用,麻烦关注一下我,给个赞吧,谢谢!

参考阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: