libsvm格式是不是二进制文件格式储存的

在libsvm中如何求最佳参数c和gamma - aolazuhong - CSDN博客
在libsvm中如何求最佳参数c和gamma
一、 如何用grip.py求最佳参数 c、γ
1.&&&&&需要安装python及gnuplot两个软件。
2.&&&&&修改libsvm-3.2所在目录下的tools中的grip.py,不可以双击点开grip.py,需要点击右键,用“Edit with IDLE”打开,修改第25行中的gnuplot的路径,将其默认路径(self.gnuplot_pathname =r&c:\tmp\gnuplot\bin\pgnuplot.exe)改为self.gnuplot_pathname = r'c:\Program Files(x86)\gnuplot\bin\gnuplot.exe'(值得注意的是,网上的教程都是叫路径改为r'c:\ProgramFiles
(x86)\gnuplot\bin\pgnuplot.exe',但是我翻阅了gnuplot的安装目录下的README-Windows文档,看到了
所以就需要把那个p去掉,才可以调用gnuplot软件。
3.&&&&&需要将python安装目录(笔者的为:C:\Python27)下的python.exe复制到F:\ProgramFiles\MATLAB\R2016a\toolbox\libsvm-3.21\tools下。
4.&&&&&打开cmd,进入F:\Program Files\MATLAB\R2016a\toolbox\libsvm-3.21\tools目录下,键入python grid.py heart_scale(heart_scale为libsvm3.21提供的二进制文件),然后就可以看到cmd上出现
还有gnuplot在不断绘制(至于图代表什么,笔者真的不太知道,但我从网上看到的资料它是在这样说的:“神奇的是尋找最佳參數的過程就像是在爬山,若爬得越高就代表準確度越好!於是這張圖被稱作等高線圖”,这段话在)
还有就是我在知乎上看到的对这堆曲线的理解
Cmd窗口不再滚动,会出现以下数据
第一个数据是最优参数c,第二个参数是γ,最后那个是运用最佳参数(而其他为默认参数)的正确率。
5.&&&&&如何用运用自己的数据求出最佳参数
a)&&&&&我们通过小波分析(也可以通过其他特征提取的方法得到的数据)得到的数据,格式是.mat格式(即matlab特有的保存数据的格式),但是我们用grip.py方法求最佳参数的需要是二进制文件,在此时我们需要将.mat格式文件转化为二进制文件。
b)&&&&&如何转化呢?
希望读者们不要像笔者那样没有看libsvm3.21中的“README”文件,那个帮助太大了。那里面有一句话“其中formatdatalibsvm.xls文件可以方便的将excel数据转化为符合LIBSVM要求的数据格式。”(再次证明README文件的重要性),所以我们就可以运用formatdatalibsvm.xls文件将.mat文件转化为二进制文件。
c)&&&&&如何运用formatdatalibsvm.xls文件?
1)&&&&&首先将formatdatalibsvm.xls下载(链接:http://pan.baidu.com/s/1kVybtER密码:t2ko)不要感谢我,我的别名叫LEIFENG
2)&&&&&包括两两种数据的转换,一种是data.xls格式-&data.svm格式的转换;另一种的带有逗号、空格、顿号、分号等文本数据的转换,先归为data.txt格式-&data.svm格式的转换。
3)&&&&&.xls格式-&svm格式的转换:首先运行formatdatalibsvm.xls,(注意这时会有一个关于“宏已禁宏”的安全警示,点击“选项”,选择“启用此内容”,确定即可);然后打开data.xls,(注:网上很多的介绍都是直接将数据粘贴到sheet1的topleft单元),但值得注意的是数据的排列方式
决策属性是label的值(注意啦),所以我们将数据粘贴到sheet1的topleft单元后需要将第一列的数据放到最后一列。
4)&&&&&然后就打开宏,点击下图所选的选项,最后点击执行
最后保存文件,保存选择Unicode文本,这样我们就得到了.txt二进制文件,最后我们就可以运用grip.py得到最优参数了。
d)&&&&&在得到了.txt文件后,我们先打开cmd,进入F:\ProgramFiles\MATLAB\R2016a\toolbox\libsvm-3.21\tools,输入pythoncheckdata.py test.txt(checkdata.py是一个检测数据是否符合格式的函数,而test是笔者格式转换后得到的文件,记得要加上后缀.txt,这个一定要加上)
数据没错的图
数据不符合格式的图(handdata是.mat文件)
e)&&&&&得到格式正确的数据后,在cmd上输入,就会出现上文4.中所 出现的情况,我们就可以得到最优参数了。
6.&&&&&值得注意的问题:
a)&&&&&Libvsm文本文件(链接:http://pan.baidu.com/s/1pLeqysN 密码:o0os)中所提到的安装后
这段话是在 ubuntu统下实现的,无法在windows系统下实现。还有libsvmguide(链接:http://pan.baidu.com/s/1hs9CKFq密码:oxfr)中所讲到的都是基于ubuntu系统下的。
b)&&&&&这篇文章是将网上教程的许多漏洞进行修补而写出来的,是笔者经过一天的配置后呕心沥血之作,如有不足,还望见谅。
相关文章推荐如何将数据转换libsvm格式文件_百度知道
如何将数据转换libsvm格式文件
我有更好的答案
再将文件重新保存为libsvm格式.  Alternatively,这种工具简单方便。  2.对于一两千的就需要借助代码之类的工具了。  其实仔细看cjlin的libsvm网站,从网站的Libsvm FAQ中有提到的格式转换的方法  Q: How to convert other data formats to LIBSVM format?  It depends on your data format. We have a simple C code to transfer space/colon separated format to libsvm format. Please contact us if needed:, 1); % labels from the 1st column  matlab&gt:end);  matlab& features_sparse = sparse(features); % features must be in a sparse matrix  matlab& libsvmwrite('SPECTF, labels, features_sparse);  The tranformed data are stored in SPECTFlibsvm。方便简单,经我测试的结果也是一致的.网上有一个xls文FormatDataL SPECTF = csvread('SPECTF; labels = SPECTF(.train. Take a CSV (colon separated format) file in UCI machine learning repository as an example. We download SPECTF.train. Labels are in the first column. The following steps produce a file ).  matlab&gt.train&#39,代入自己的数据则可以达到效果。  3.可以利用weka来转换,用weka打开csv文件:, 2; features = SPECTF(.  按照上面的命令; % read a csv file  matlab&gt.xls具有宏命令,可以利用其中的宏命令来实现。对于属性数据只有一二百的.train&#39, a simple way is to use libsvmwrite in the libsvm matlab/octave interface  有三种工具可用  1
为您推荐:
其他类似问题
libsvm的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
就是用C++ 写文件 用到 std::ios::binary这样的方式写文件,要按照什么格式读能看到010101,或者0xFF这种数据而不是一些不可打印的字符
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
.bin后缀名,意思为binary.
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)libsvm&训练后的模型参数讲解
主要就是讲解利用libsvm-mat工具箱建立分类(回归模型)后,得到的模型model里面参数的意义都是神马?以及如果通过model得到相应模型的表达式,这里主要以分类问题为例子。
测试数据使用的是libsvm-mat自带的heart_scale.mat数据(270*13的一个属性据矩阵,共有270个样本,每个样本有13个属性),方便大家自己测试学习。
首先上一个简短的测试代码:
%% ModelDecryption
by faruto @ faruto's Studio~
http://blog.sina.com.cn/faruto
http://www.matlabsky.com
http://www.mfun.la
http://video.ourmatlab.com
last modified by
%% a litte clean work
首先载入数据
load heart_
data = heart_scale_
label = heart_scale_
建立分类模型
model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g
利用建立的模型看其在训练集合上的分类效果
[PredictLabel,accuracy] =
svmpredict(label,data,model);
运行结果:
Parameters: [5x1 double]
nr_class: 2
totalSV: 259
rho: 0.0514
Label: [2x1 double]
nSV: [2x1 double]
sv_coef: [259x1 double]
SVs: [259x13 double]
Accuracy = 99.6296% (269/270) (classification)
accuracy =
Elapsed time is 0.040155 seconds.
这里面为了简单起见没有将测试数据进行训练集和测试集的划分,这里仅仅是为了简单明了而已,分类结果估计可以不要管,参数优化也不要管,另有帖子讲解。
下面我们就看看 model这个结构体里面的各种参数的意义都是神马,model如下:
Parameters: [5x1 double]
nr_class: 2
totalSV: 259
rho: 0.0514
Label: [2x1 double]
nSV: [2x1 double]
sv_coef: [259x1 double]
SVs: [259x13 double]
model.Parameters
我们先来看一下model.Parameters里面承装的都是什么:
model.Parameters
重要知识点:
model.Parameters参数意义从上到下依次为:
-s svm类型:SVM设置类型(默认0)
-t 核函数类型:核函数设置类型(默认2)
-d degree:核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)
(默认类别数目的倒数)
-r coef0:核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)即在本例中通过model.Parameters我们可以得知 &s 参数为0;-t 参数为 2;-d 参数为3;-g 参数为2.8(这也是我们自己的输入);-r 参数为0。
关于libsvm参数的一点小说明:
Libsvm中参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。
model.Label
model.nr_class
&& model.Label
&& model.nr_class
重要知识点:
model.Label表示数据集中类别的标签都有什么,这里是 1,-1;
model.nr_class表示数据集中有多少类别,这里是二分类。
model.totalSV
&& model.totalSV
&& model.nSV
重要知识点:
model.totalSV代表总共的支持向量的数目,这里共有259个支持向量;
model.nSV表示每类样本的支持向量的数目,这里表示标签为1的样本的支持向量有118个,标签为-1的样本的支持向量为141。注意:这里model.nSV所代表的顺序是和model.Label相对应的。
model.ProbA
model.ProbB
关于这两个参数这里不做介绍,使用-b参数时才能用到,用于概率估计。
-b probability_estimates:
whether to train a SVC or SVR model for probability estimates, 0 or
1 (default 0)
model.sv_coef model.SVs model.rho
sv_coef: [259x1 double]
SVs: [259x13 double]
model.rho = 0.0514
重要知识点:
model.sv_coef是一个259*1的矩阵,承装的是259个支持向量在决策函数中的系数;
model.SVs是一个259*13的稀疏矩阵,承装的是259个支持向量。
model.rho是决策函数中的常数项的相反数(-b)
在这里首先我们看一下 通过 &s 0
参数(C-SVC模型)得到的最终的分类决策函数的表达式是怎样的?这里如果有关于C-SVC模型不懂的地方,请看这个pdf文件:
libsvm_library.pdf附件:最终的决策函数为:在由于我们使用的是RBF核函数(前面参数设置 &t
2),故这里的决策函数即为:其中|| x-y
||是二范数距离 ;这里面的
b就是-model.rho(一个标量数字);
b = -model.
n代表支持向量的个数即 n =
model.totalSV(一个标量数字); 对于每一个i:
wi =model.sv_coef(i); 支持向量的系数(一个标量数字)
xi = model.SVs(i,:) 支持向量(1*13的行向量)
x 是待预测标签的样本 (1*13的行向量)
gamma 就是 -g
参数好的下面我们通过model提供的信息自己建立上面的决策函数如下:
%% DecisionFunction
function plabel = DecisionFunction(x,model)
gamma = model.Parameters(4);
RBF = @(u,v)( exp(-gamma.*sum( (u-v).^2) ) );
len = length(model.sv_coef);
for i = 1:len
= model.SVs(i,:);
= y + model.sv_coef(i)*RBF(u,x);
plabel = 1;
plabel = -1;
有了这个决策函数,我们就可以自己预测相应样本的标签了:
plable = zeros(270,1);
for i = 1:270
= data(i,:);
plabel(i,1) = DecisionFunction(x,model);
验证自己通过决策函数预测的标签和svmpredict给出的标签相同
flag = sum(plabel == PredictLabel)
最终可以看到 flag = 270
,即自己建立的决策函数是正确的,可以得到和svmpredict得到的一样的样本的预测标签,事实上svmpredict底层大体也就是这样实现的。最后我们来看一下,svmpredict得到的返回参数的意义都是什么在下面这段代码中 :
首先载入数据
load heart_
data = heart_scale_
label = heart_scale_
建立分类模型
model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g
利用建立的模型看其在训练集合上的分类效果
[PredictLabel,accuracy] =
svmpredict(label,data,model);
运行可以看到
Parameters: [5x1 double]
nr_class: 2
totalSV: 259
rho: 0.0514
Label: [2x1 double]
nSV: [2x1 double]
sv_coef: [259x1 double]
SVs: [259x13 double]
Accuracy = 99.6296% (269/270) (classification)
accuracy =
这里面要说一下返回参数accuracy的三个参数的意义。重要的知识点:
返回参数accuracy从上到下依次的意义分别是:分类准率(分类问题中用到的参数指标)平均平方误差(MSE (mean squared error)) [回归问题中用到的参数指标]平方相关系数(r2 (squared correlation coefficient))[回归问题中用到的参数指标]其中mse 和r2的计算公式分别为:插图:写在后面的话,至此关于model中相应参数的一些意义,以及到底如果得到决策函数的表达式或者计算方式的就算是说的很明了了。可能还有的同学会问,如何得到分类决策函数中的那个alpha系数【这个肯定会有人问】,还是再磨叽说一下吧:上面的wi其实是alpha和支持向量的类别标签(1或-1的乘积),原始决策函数的表达式如下:插图:上面的yi是支持向量的类别标签(1或者-1),在libsvm中将yi和alpha的乘积放在一起用model.sv_coef(w)来承装。都说到这份上,应该能明白了吗?
再说点废话:就是在关于SVM的学习中,我发现很多朋友都不主动思考和尝试,老是在问,这样很不好,这样很被动,上面这些也没有人教我,都是我自己思考出来,然后编程验证,如果出现不合理的地方就再继续思考,反正道理和书籍里面都有讲解,总能洞穿的啊。O(∩_∩)O&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 c语言二进制输出格式 的文章

 

随机推荐