花了一晚上去看了Libsvm,想用C++使用Libsvm实现数据集的训练和预测。。。看了网上好多教程一个比一个不靠谱,很多都是说自己怎么实现训练算法,怎么怎么样的,我只想用内置的函数自己测试一下呀!! 最后只能自己去看了readme,终于实现了。。。记录一下萌新的学习过程
首先Libsvm是包含了训练函数的,也就是你什么都不用改,输入采集的数据,就可以运行拿去训练,和预测,里面的svm-train和svm-predict函数就是,用法也很简单。
下面介绍用法:
在linux环境下(我自己的是ubuntu16.04),在下载的Libsvm-3.23里,打开终端,输入make
,然后就会自动编译出几个可执行文件,名字就叫svm-predict 和svm-train,没错就是那个图标像菱形那个,然后在终端打开(比如打开svm-train就在终端里输入./svm-train XXXXX
)记得输入参数,参数在readme里写好了 比如-s -t 什么的 我输入的就是这样,参数要求是:
./svm-train [可选参数] 训练数据集 [目标模型文件]
比如我输入的就是
./svm-train -s 0 -t 0 data_libsvm.txt result
这里的-s -t 都是参数,详情请看readme,然后我用的都是默认参数,后面那个txt就是我自己采的数据集,这个一会再说,然后result就是输出文件的名字,就是最后会产生的模型model文件,后面预测要用
这里训练就完了,训练出的模型也有了,那么数据是怎么采集的呢,各种方法都有啊。。。手写都行。。。只要你把txt文件写成他要求的这个形式就行,其中label就是那个标签y,取的1,-1,index1输入的x的维度的序号,value就是它对应的值啦
比如我的标签就长这样
-1 1:196 2:201
-1 1:185 2:190
1 1:186 2:189
-1 1:183 2:188
1 1:177 2:184
就说明这是2维度的x啦,我的测试集制作是用matlab,先取了一张图,然后ginput函数取点,然后去这些点的RGB中的R和B的值获得的,格式实现很简单无脑。。脚本贴上来给你们看看吧。。大佬勿喷啊
figure;
%subplot(1,2,1);
imshow('1.jpg');
title(鼠标左键为1,右键为3')
[xx_1,yy_1,button_1] = ginput;
RGB = imread('1.jpg');
RGB = double(RGB);
RR = RGB(:,:,1);
GG = RGB(:,:,2);
BB = RGB(:,:,3);
[count,asd]=size(xx_1);
%subplot(1,2,2); hold on;
%svm_1
xx_1 = round(xx_1);
yy_1 = round(yy_1);
for i=1:count
trnx_1(i,:)=[RR(yy_1(i),xx_1(i)),GG(yy_1(i), xx_1(i))];
switch button_1(i)
case 1
trny_1(i,:)=-1;
% plot(trnx(i,1),trnx(i,2),'r*');
case 3
trny_1(i,:)=1;
% plot(trnx(i,1),trnx(i,2),'b+');
otherwise
end
end
fid = fopen('data_libsvm_pre.txt','w');
for i = 1:count
fprintf(fid,'%d',trny_1(i,1));
fprintf(fid,'%s',' ');
fprintf(fid,'%d',1);
fprintf(fid,'%s',':');
fprintf(fid,'%d',trnx_1(i,1));
fprintf(fid,'%s',' ');
fprintf(fid,'%d',2);
fprintf(fid,'%s',':');
fprintf(fid,'%d',trnx_1(i,2));
fprintf(fid,'\r\n');
end
都是最基础的代码,这个就实现了我的数据集啦,然后就拿去训练就能出测试集了,接着上面说,有了数据集就能训练出模型,然后当然也能测试啦,而且产生的标签也可以拿去直接用,还是很不错的,那测试集有什么要求呢,要求就是和训练数据集一样的格式,那么要测试的数据集没标签啊,这个就可以随便标。。。最后预测的结果就是一大堆标签,而且你带标签的话会告诉你准确率是多少,预测的方法跟训练很像,也是直接运行那个叫做svm-predict的可执行文件,他的要求是:
./svm-predict [可选参数] 测试数据集 模型文件 目标文件
比如我输入的是:
./svm-predict data_libsvm_pre.txt result p_result
这里我的测试集是data_libsvm_pre.txt,模型文件就是训练产生的文件,就是这个result,然后输出的训练结果是 p_result,给大家看一下训练结果文件长什么样子
-1
-1
-1
-1
-1
-1
-1
-1
1
1
1
没错就是一堆标签,就可以拿去用了。。。是不是相当简单,为我浪费的这一晚上默哀。。。没错这就是萌新教萌新的超新手教程~