如何使用libsvm对训练集各属性做重要程度副词排序排序

下次自动登录
现在的位置:
& 综合 & 正文
生成libSVM的数据格式及使用方法总结
首先介绍一下 libSVM的数据格式
Label 1:value 2:value ….
Label:是类别的标识,比如上节train.model中提到的1
-1,你可以自己随意定,比如-10,0,15。当然,如果是回归,这是目标值,就要实事求是了。
Value:就是要训练的数据,从分类的角度来说就是特征值,数据之间用空格隔开
-15 1:0.708 2:.3333
需要注意的是,如果特征值为0,特征冒号前面的(姑且称做序号)可以不连续。如:
-15 1:0.708
表明第2个特征值为0,从编程的角度来说,这样做可以减少内存的使用,并提高做矩阵内积时的运算速度。我们平时在matlab中产生的数据都是没有序号的常规矩阵,所以为了方便最好编一个进行转化。
怎样生成libsvm所用的数据格式
第一种方法 使用FormatDataLibsvm.xls
我已经保存在我百度网盘里面了,可免费下载~记得以前是在新浪爱问下载的,需要积分……
下载地址为/share/link?shareid=447079&uk=
运行FormatDataLibsvm.xls(注意这时会有一个关于“宏已禁宏”的安全警示,点击“选项”,选择“启用此内容”,确定即可);1,先运行FormatDataLibsvm.xls然后将数据粘贴到sheet1的topleft单元。
2、 打开data.xls,(注:网上很多的介绍都是直接将数据粘贴到sheet1的topleft单元),要特别注意的是这时候的数据排列顺序应该是:
3、"工具"--&"宏"--&执行下面有一个选项(FormatDatatoLibsvm)--&执行,要选中这个然后点击“运行” ,这时候数据讲变成:
等数据转换完成后,将该文件保存为.txt文件。这时数据转换的问题就解决了。
第二种方法
.txt格式-&svm格式的转换(该段转自)
首先说明的是,这里所提的.txt文本数据是指数据文件带有逗号、空格、顿号、分号等数据分离符号的数据文件。因为其用符号来分离,导致所有数据项都归类为一个属性,无法实现上面2步骤的格式输入,也就无法实现正确结果格式的输出了。
为了解决该问题,转换该过程与上面一过程的最大不同就在于:在打开该.txt文件的时候根据文本数据本身的数据特点将其所包含的逗号、分号、制表符等数据分离的符号去掉;具体的做法是:转换运行FormatDataLibsvm.xls,“文件”-&“打开”-&选择要打开的data,txt文件,接着在文本导入向导中根据data.txt文件本身的数据特点选择“原始数据类型(分隔符号)”;接着选择分隔符号的类型(目地是使得该数据分成独立的一列列数据,分离成功的话,在数据预览中将可以看到一列列分离独立的数据) :选择“列数据格式”(常规)-&完成;
这时候只要调整上面"一"过程的数据格式,重复其后面的步骤2、3操作即可。
第三种方法
其实libsvm所需的数据也可以自己生成~比如我之前是利用图像的颜色特征进行图像分割,先用程序读取RGB值然后保存在txt文件中就可以了~只不过要注意保存的格式
如何使用这些数据
以简单的使用为例
在用libsvm自带的一个例子heart_scale.mat时,一切正常~
load heart_scale.mat(此处无分号)
train = heart_scale_
train_label=heart_scale_
test_label=train_
model=svmtrain(train_label,train,'-c 2 -g 0.01');
[predict_label,accuracy]=svmpredict(test_label,test,model);
但是在我们用自己的例子时出现了问题~
= heart_scale_是用的mat文件的特征列
train_label=heart_scale_用的是mat文件的标签列
而我们生成的txt或者mat文件还没有进行赋值所以一开始进行赋值就可以了~
A=[newmat(1:)];%特征列
B=[newmat(1:2288,4)];%标签列
train = A;
train_label=B;
目前只进行了简单的训练以及测试……END
&&&&推荐文章:
【上篇】【下篇】查看: 5953|回复: 10|关注: 0
用Libsvm做分类预测和回归预测,怎么设定训练集和测试集
<h1 style="color:# 麦片财富积分
新手, 积分 5, 距离下一级还需 45 积分
比如使用LIBSVM工具箱附带的那个数据集,如何设定训练集和测试集啊,谢谢
<h1 style="color:#1 麦片财富积分
关注者: 40
训练集和测试集可以随机选取啊
<h1 style="color:#7 麦片财富积分
关注者: 7
回复 1# dsk8672 的帖子
训练数据集和测试数据集是根据你自己的要求自己确定的,这个到是没有什么一定。
<h1 style="color:# 麦片财富积分
请问怎么设定呢训练集和测试级的大小呢?
<h1 style="color:# 麦片财富积分
这个随意的,你自己选取好了,大小可以取总量的十分之一左右
<h1 style="color:# 麦片财富积分
回复 4# dsk8672 的帖子
经验上是训练集取总样本的80%到90%之间,测试集取剩下的部分,如果你的数据是有时间先后关系的话,最好按顺序取,如果没有,那就很随意了,你可以随机取
<h1 style="color:# 麦片财富积分
自由设定谢谢楼上两位的回答,我的数据确实是有时间顺序的,请问在实际编程中如何自由设定呢,有程序的SAMPLE吗?谢谢
[ 本帖最后由 dsk8672 于
17:48 编辑 ]
<h1 style="color:# 麦片财富积分
最好先做个 混合。。。。效果会好些!!
<h1 style="color:# 麦片财富积分
为什么我的问题就没人回答呢?~~~~(&_&)~~~~ 在SVM中,如果一个属性对应多个值,如何处理???
用心学习!!!
<h1 style="color:# 麦片财富积分
一个数据集,train-date,test-date ,实际编程中如何自由设定 ?
站长推荐 /1
活动地点已更新
Powered by本帖子主要就是讲解利用libsvm-mat工具箱建立分类&#57345;回归模型&#57346;后&#57347;得到的
模型model里面参数的意义都是神马&#57349;以及如果通过model得到相应模型的表达
式&#57347;这里主要以分类问题为例子。
测试数据使用的是libsvm-mat自带的heart_scale.mat数据&#的一个属
性据矩阵&#57347;共有270个样本&#57347;每个样本有13个属性&#57346;&#57347;方便大家自己测试学习。
首先上一个简短的测试代码&#57348;& 1. %% ModelDecryption
2. % by faruto @ faruto's Studio~
4. % Email:
8. % last modified by
9. %% a litte clean work
16. % 首先载入数据
17. load heart_
18. data = heart_scale_
19. label = heart_scale_
20. % 建立分类模型
21. model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8');
23. % 利用建立的模型看其在训练集合上的分类效果
24. [PredictLabel,accuracy] = svmpredict(label,data,model);
25. accuracy
复制代码& 运行结果&#57348;& 1. model =& 2. Parameters: [5x1 double]
3. nr_class: 2
4. totalSV: 259
5. rho: 0.0514
6. Label: [2x1 double]
7. ProbA: []
8. ProbB: []
9. nSV: [2x1 double]
10. sv_coef: [259x1 double]
11. SVs: [259x13 double]
12. Accuracy = 99.6296% (269/270) (classification)
13. accuracy =
14. 99.6296
15. 0.0148
16. 0.9851
17. Elapsed time is 0.040155 seconds.
复制代码& 这里面为了简单起见没有将测试数据进行训练集和测试集的划分&#57345;这里仅仅是为
了简单明了而已&#57345;分类结果估计可以不要管&#57345;参数优化也不要管&#57345;另有帖子讲解。
下面我们就看看 model这个结构体里面的各种参数的意义都是神马&#57345;model如
下&#57346; 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里面承装的都是什么&#57346;& 1. && model.Parameters
2. ans = 3. 0
复制代码& 重要知识点&#57348; model.Parameters参数意义从上到下依次为&#57348;
-s svm类型&#57348;SVM设置类型(默认0)
-t 核函数类型&#57348;核函数设置类型(默认2)
-d degree&#57348;核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama)&#57348;核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的
-r coef0&#57348;核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
即在本例中通过model.Parameters我们可以得知 –s 参数为0&#57349;-t 参数为 2&#57349;-d 参数为3&#57349;
-g 参数为2.8&#57345;这也是我们自己的输入&#57346;&#57349;-r 参数为0。
关于libsvm参数的一点小说明&#57348;
Libsvm中参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合&#57347;如果设置的
参数在函数或SVM类型中没有也不会产生影响&#57347;程序不会接受该参数&#57349;如果应有的参数设
置不正确&#57347;参数将采用默认&#20540;。
model.Label model.nr_class&
1. && model.Label
5. && model.nr_class
复制代码& 重要知识点&#57348; model.Label表示数据集中类别的标签都有什么&#57347;这里是 1&#5349;
model.nr_class表示数据集中有多少类别&#57347;这里是二分类。&&
model.totalSV model.nSV& 1. && model.totalSV
4. && model.nSV
复制代码& 重要知识点&#57348; model.totalSV代表总共的支持向量的数目&#57347;这里共有259个支持向量&#57349;
model.nSV表示每类样本的支持向量的数目&#57347;这里表示标签为1的样本的支持向量有118个&#57347;
标签为-1的样本的支持向量为141。
注意&#57348;这里model.nSV所代表的顺序是和model.Label相对应的。&
model.ProbA model.ProbB
关于这两个参数这里不做介绍&#57347;使用-b参数时才能用到&#57347;用于概率估计。 -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& 1. sv_coef: [259x1 double]
2. SVs: [259x13 double]
3. model.rho = 0.0514
复制代码& 重要知识点&#57348; model.sv_coef是一个259*1的矩阵&#57347;承装的是259个支持向量在决策函数中的系数&#57349;
model.SVs是一个259*13的稀疏矩阵&#57347;承装的是259个支持向量。
model.rho是决策函数中的常数项的相反数&#57345;-b&#57346; 在这里首先我们看一下 通过 –s 0 参数&#57345;C-SVC模型&#57346;得到的最终的分类决策
函数的表达式是怎样的&#57350;
这里如果有关于C-SVC模型不懂的地方&#57347;请看这个pdf文件&#57348;
libsvm_library.pdf
附件&#57348;
最终的决策函数为&#57348; 在由于我们使用的是RBF核函数&#57344;前面参数设置 –t 2&#57345;&#57346;故这里的决策函数即
为&#57347;
其中|| x-y ||是二范数距离 ;
b就是-model.rho&#57344;一个标量数字&#57345;;
b = -model.
n代表支持向量的个数即 n = model.totalSV&#57344;一个标量数字&#57345;&#57348;&
对于每一个i&#57347;
wi =model.sv_coef(i); 支持向量的系数&#57344;一个标量数字&#57345;
xi = model.SVs(i,:) 支持向量&#的行向量&#57345;
x 是待预测标签的样本 &#的行向量&#57345;
gamma 就是 -g 参数
好的下面我们通过model提供的信息自己建立上面的决策函数如下&#57347;& 1. %% DecisionFunction
2. function plabel = DecisionFunction(x,model)
4. gamma = model.Parameters(4);
5. RBF = @(u,v)( exp(-gamma.*sum( (u-v).^2) ) );
7. len = length(model.sv_coef);
10. for i = 1:len
11. u = model.SVs(i,:);
12. y = y &#43; model.sv_coef(i)*RBF(u,x);
14. b = -model.
15. y = y &#43;
17. if y &= 0
18. plabel = 1;
20. plabel = -1;
复制代码& 有了这个决策函数&#57346;我们就可以自己预测相应样本的标签了&#57347;& 1. %%
2. plable = zeros(270,1);
3. for i = 1:270
4. x = data(i,:); 5. plabel(i,1) = DecisionFunction(x,model);
8. %% 验证自己通过决策函数预测的标签和svmpredict给出的标签相同
9. flag = sum(plabel == PredictLabel)
10. over = 1;
复制代码& 最终可以看到 flag = 270 &#57345;即自己建立的决策函数是正确的&#57345;可以得到和
svmpredict得到的一样的样本的预测标签&#57345;事实上svmpredict底层大体也就是
这样实现的。
最后我们来看一下&#57345;svmpredict得到的返回参数的意义都是什么
在下面这段代码中 :& 1. %%&
2. % 首先载入数据
3. load heart_
4. data = heart_scale_
5. label = heart_scale_
6. % 建立分类模型
7. model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8');
9. % 利用建立的模型看其在训练集合上的分类效果
10. [PredictLabel,accuracy] = svmpredict(label,data,model);
11. accuracy
复制代码& 运行可以看到& 1. model =&
2. Parameters: [5x1 double]
3. nr_class: 2
4. totalSV: 259
5. rho: 0.0514
6. Label: [2x1 double]
7. ProbA: []
8. ProbB: []
9. nSV: [2x1 double]
10. sv_coef: [259x1 double]
11. SVs: [259x13 double]
12. Accuracy = 99.6296% (269/270) (classification)
13. accuracy =
14. 99..0148
16. 0.9851
复制代码& 这里面要说一下返回参数accuracy的三个参数的意义。
重要的知识点&#57351; 返回参数accuracy从上到下依次的意义分别是&#57351;
分类准率&#57348;分类问题中用到的参数指标&#57349;
平均平方误差&#57348;MSE (mean squared error)&#57349; [回归问题中用到的参数指标]
平方相关系数&#57348;r2 (squared correlation coefficient)&#57349;[回归问题中用到的参数指标]
其中mse 和r2的计算公式分别为&#57351;
插图&#57351;
写在后面的话&#57350;至此关于model中相应参数的一些意义&#57350;以及到底如果得到决策函数的表
达式或者计算方式的就算是说的很明了了。
可能还有的同学会问&#57350;如何得到分类决策函数中的那个alpha系数【这个肯定会有人问】&#57350;
还是再磨叽说一下吧&#57351;
上面的wi其实是alpha和支持向量的类别标签&#57348;1或-1的乘积&#57349;&#57350;原始决策函数的表达式如
下&#57351;
插图&#57351;
上面的yi是支持向量的类别标签&#57348;1或者-1&#57349;&#57350;在libsvm中将yi和alpha的乘积放在一起用
model.sv_coef&#57348;w&#57349;来承装。
都说到这份上&#57350;应该能明白了吗&#57352;
再说点废话&#57351;就是在关于SVM的学习中&#57350;我发现很多朋友都不主动思考和尝试&#57350;老是在问&#57350;
这样很不好&#57350;这样很被动&#57350;上面这些也没有人教我&#57350;都是我自己思考出来&#57350;然后编程验证&#57350;
如果出现不合理的地方就再继续思考&#57350;反正道理和书籍里面都有讲解&#57350;总能洞穿的啊。
O(∩_∩)O?
Anyway&#57350;有关于SVM的问题还是可以一起探讨的&#57350;但您首先要独立思考一下下才好&#57350;您说
&libsvm 训练后的模型参数讲解 本帖子主要就是讲解利用libsvm-mat工具箱建立分类&#57345;回归模型&#57346;后&#57347;得到的
模型model里面参数的意义都是神马&#57349;以及如果通过model得到相应模型的表达
式&#57347;这里主要以分类问题为例子。
测试数据使用的是libsvm-mat自带的heart_scale.mat数据&#的一个属
性据矩阵&#57347;共有270个样本&#57347;每个样本有13个属性&#57346;&#57347;方便大家自己测试学习。
首先上一个简短的测试代码&#57348; 1. %% ModelDecryption
2. % by faruto @ faruto's Studio~
3. % .cn/faruto
4. % Email:
6. % http://www.mfun.la
8. % last modified by
9. %% a litte clean work
16. % 首先载入数据
17. load heart_
18. data = heart_scale_
19. label = heart_scale_
20. % 建立分类模型
21. model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8');
23. % 利用建立的模型看其在训练集合上的分类效果
24. [PredictLabel,accuracy] = svmpredict(label,data,model);
25. accuracy
复制代码 运行结果&#57348; 1. model = 2. Parameters: [5x1 double]
3. nr_class: 2
4. totalSV: 259
5. rho: 0.0514
6. Label: [2x1 double]
7. ProbA: []
8. ProbB: []
9. nSV: [2x1 double]
10. sv_coef: [259x1 double]
11. SVs: [259x13 double]
12. Accuracy = 99.6296% (269/270) (classification)
13. accuracy =
14. 99.6296
15. 0.0148
16. 0.9851
17. Elapsed time is 0.040155 seconds.
复制代码 这里面为了简单起见没有将测试数据进行训练集和测试集的划分&#57345;这里仅仅是为
了简单明了而已&#57345;分类结果估计可以不要管&#57345;参数优化也不要管&#57345;另有帖子讲解。
下面我们就看看 model这个结构体里面的各种参数的意义都是神马&#57345;model如
下&#57346; 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里面承装的都是什么&#57346; 1. && model.Parameters
2. ans = 3. 0
复制代码 重要知识点&#57348; model.Parameters参数意义从上到下依次为&#57348;
-s svm类型&#57348;SVM设置类型(默认0)
-t 核函数类型&#57348;核函数设置类型(默认2)
-d degree&#57348;核函数中的degree设置(针对多项式核函数)(默认3)
-g r(gama)&#57348;核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的
-r coef0&#57348;核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
即在本例中通过model.Parameters我们可以得知 –s 参数为0&#57349;-t 参数为 2&#57349;-d 参数为3&#57349;
-g 参数为2.8&#57345;这也是我们自己的输入&#57346;&#57349;-r 参数为0。
关于libsvm参数的一点小说明&#57348;
Libsvm中参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合&#57347;如果设置的
参数在函数或SVM类型中没有也不会产生影响&#57347;程序不会接受该参数&#57349;如果应有的参数设
置不正确&#57347;参数将采用默认&#20540;。
model.Label model.nr_class
1. && model.Label
5. && model.nr_class
复制代码 重要知识点&#57348; model.Label表示数据集中类别的标签都有什么&#57347;这里是 1&#5349;
model.nr_class表示数据集中有多少类别&#57347;这里是二分类。
model.totalSV model.nSV 1. && model.totalSV
4. && model.nSV
复制代码 重要知识点&#57348; model.totalSV代表总共的支持向量的数目&#57347;这里共有259个支持向量&#57349;
model.nSV表示每类样本的支持向量的数目&#57347;这里表示标签为1的样本的支持向量有118个&#57347;
标签为-1的样本的支持向量为141。
注意&#57348;这里model.nSV所代表的顺序是和model.Label相对应的。
model.ProbA model.ProbB
关于这两个参数这里不做介绍&#57347;使用-b参数时才能用到&#57347;用于概率估计。 -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 1. sv_coef: [259x1 double]
2. SVs: [259x13 double]
3. model.rho = 0.0514
复制代码 重要知识点&#57348; model.sv_coef是一个259*1的矩阵&#57347;承装的是259个支持向量在决策函数中的系数&#57349;
model.SVs是一个259*13的稀疏矩阵&#57347;承装的是259个支持向量。
model.rho是决策函数中的常数项的相反数&#57345;-b&#57346; 在这里首先我们看一下 通过 –s 0 参数&#57345;C-SVC模型&#57346;得到的最终的分类决策
函数的表达式是怎样的&#57350;
这里如果有关于C-SVC模型不懂的地方&#57347;请看这个pdf文件&#57348;
libsvm_library.pdf
附件&#57348;
最终的决策函数为&#57348; 在由于我们使用的是RBF核函数&#57344;前面参数设置 –t 2&#57345;&#57346;故这里的决策函数即
为&#57347;
其中|| x-y ||是二范数距离 ;
b就是-model.rho&#57344;一个标量数字&#57345;;
b = -model.
n代表支持向量的个数即 n = model.totalSV&#57344;一个标量数字&#57345;&#57348;
对于每一个i&#57347;
wi =model.sv_coef(i); 支持向量的系数&#57344;一个标量数字&#57345;
xi = model.SVs(i,:) 支持向量&#的行向量&#57345;
x 是待预测标签的样本 &#的行向量&#57345;
gamma 就是 -g 参数
好的下面我们通过model提供的信息自己建立上面的决策函数如下&#57347; 1. %% DecisionFunction
2. function plabel = DecisionFunction(x,model)
4. gamma = model.Parameters(4);
5. RBF = @(u,v)( exp(-gamma.*sum( (u-v).^2) ) );
7. len = length(model.sv_coef);
10. for i = 1:len
11. u = model.SVs(i,:);
12. y = y &#43; model.sv_coef(i)*RBF(u,x);
14. b = -model.
15. y = y &#43;
17. if y &= 0
18. plabel = 1;
20. plabel = -1;
复制代码 有了这个决策函数&#57346;我们就可以自己预测相应样本的标签了&#57347; 1. %%
2. plable = zeros(270,1);
3. for i = 1:270
4. x = data(i,:); 5. plabel(i,1) = DecisionFunction(x,model);
8. %% 验证自己通过决策函数预测的标签和svmpredict给出的标签相同
9. flag = sum(plabel == PredictLabel)
10. over = 1;
复制代码 最终可以看到 flag = 270 &#57345;即自己建立的决策函数是正确的&#57345;可以得到和
svmpredict得到的一样的样本的预测标签&#57345;事实上svmpredict底层大体也就是
这样实现的。
最后我们来看一下&#57345;svmpredict得到的返回参数的意义都是什么
在下面这段代码中 : 1. %%
2. % 首先载入数据
3. load heart_
4. data = heart_scale_
5. label = heart_scale_
6. % 建立分类模型
7. model = svmtrain(label,data,'-s 0 -t 2 -c 1.2 -g 2.8');
9. % 利用建立的模型看其在训练集合上的分类效果
10. [PredictLabel,accuracy] = svmpredict(label,data,model);
11. accuracy
复制代码 运行可以看到 1. model =
2. Parameters: [5x1 double]
3. nr_class: 2
4. totalSV: 259
5. rho: 0.0514
6. Label: [2x1 double]
7. ProbA: []
8. ProbB: []
9. nSV: [2x1 double]
10. sv_coef: [259x1 double]
11. SVs: [259x13 double]
12. Accuracy = 99.6296% (269/270) (classification)
13. accuracy =
14. 99..0148
16. 0.9851
复制代码 这里面要说一下返回参数accuracy的三个参数的意义。
重要的知识点&#57351; 返回参数accuracy从上到下依次的意义分别是&#57351;
分类准率&#57348;分类问题中用到的参数指标&#57349;
平均平方误差&#57348;MSE (mean squared error)&#57349; [回归问题中用到的参数指标]
平方相关系数&#57348;r2 (squared correlation coefficient)&#57349;[回归问题中用到的参数指标]
其中mse 和r2的计算公式分别为&#57351;
插图&#57351;
写在后面的话&#57350;至此关于model中相应参数的一些意义&#57350;以及到底如果得到决策函数的表
达式或者计算方式的就算是说的很明了了。
可能还有的同学会问&#57350;如何得到分类决策函数中的那个alpha系数【这个肯定会有人问】&#57350;
还是再磨叽说一下吧&#57351;
上面的wi其实是alpha和支持向量的类别标签&#57348;1或-1的乘积&#57349;&#57350;原始决策函数的表达式如
下&#57351;
插图&#57351;
上面的yi是支持向量的类别标签&#57348;1或者-1&#57349;&#57350;在libsvm中将yi和alpha的乘积放在一起用
model.sv_coef&#57348;w&#57349;来承装。
都说到这份上&#57350;应该能明白了吗&#57352;
再说点废话&#57351;就是在关于SVM的学习中&#57350;我发现很多朋友都不主动思考和尝试&#57350;老是在问&#57350;
这样很不好&#57350;这样很被动&#57350;上面这些也没有人教我&#57350;都是我自己思考出来&#57350;然后编程验证&#57350;
如果出现不合理的地方就再继续思考&#57350;反正道理和书籍里面都有讲解&#57350;总能洞穿的啊。
O(∩_∩)O?
Anyway&#57350;有关于SVM的问题还是可以一起探讨的&#57350;但您首先要独立思考一下下才好&#57350;您说
&#65279;&#65279;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:7266次
排名:千里之外
原创:79篇
转载:33篇
(2)(6)(11)(46)(48)svmutil中主要包含了以下几个函数:
svm_train(): train an SVM model
Train ( 训练 ) data. 跑 SVM 被戏称为 & 开火车 & 也是由于这个程序名而来 . train 会接受特定&#26684;式的输入 , 产生一个 &Model& 檔 . 这个 model 你可以想象成 SVM 的内部数据 , 因为 predict 要 model 才能 predict, 不能直接吃原始数据 . 想想也很合理 , 假定 train 本身是很耗时的动作 , 而 train 好可以以某种形式存起内部数据
, 那下次要 predict 时直接把那些内部数据 load 进来就快多了 .
svm_predict() & & &: predict testing data
依照已经 train 好的 model, 再加上给定的输入 ( 新&#20540; ), 输出 predict ( 预测 ) 新&#20540;所对应的类别 (class)
svm_read_problem() : read the data from a LIBSVM-format file.
来说,我们不是每个点都有 X 跟 Y 的坐标吗? 所以它就有 两种 attribute 。 假定我有两个点: (0,3) 跟 (5,8) 分别在 label(class) 1 跟 2 ,那就会写成 1 1:0 2:3
同理,空间中的三维坐标就等于有三组 attribute 。
这种档案&#26684;式最大的好处就是可以使用 sparse matrix , 或说有些 data 的 attribute 可以不存在。
svmscale:Rescale data.
因为原始数据可能范围过大或过小 , svmscale 可以先将数据重新 scale ( 缩放 ) 到适当范围 .这种档案&#26684;式最大的好处就是可以使用 sparse matrix , 或说有些 data 的 attribute 可以不存在。
svm_load_model() & : load a LIBSVM model.
svm_save_model() & : save model to a file.
evaluations() & & &: evaluate prediction results.
LIBSVM&使用的一般步骤是:
1)按照LIBSVM软件包所要求的&#26684;式准备数据集;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
2)对数据进行简单的缩放操作;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
3)首要考虑选用RBF&核函数;
4)采用交叉验证选择最佳参数C与g&;
5)采用最佳参数C与g&对整个训练集进行训练获取支持向量机模型;
6)利用获取的模型进行测试与预测。
1)LIBSVM使用的数据&#26684;式
&&&&该软件使用的训练数据和检验数据文件&#26684;式如下:
[label] [index1]:[value1] [index2]:[value2] ...
[label] [index1]:[value1] [index2]:[value2] ...
一行一条记录数据,如:
&#43;1&1:0.708&2:1&3:1&4:-0.320&5:-0.105&6:-1
这里(x,y)à((0.708,1,1, -0.320, -0.105, -1), &#43;1)
label&或说是class,&就是你要分类的种类,通常是一些整数。
index&是有順序的索引,通常是连续的整数。
value&就是用来&train&的数据,通常是一堆实数。
2)对数据进行简单的缩放操作
&&&&扫描数据.&因为原始数据可能范围过大或过小, svmscale可以先将数据重新scale (縮放)&到适当范围使训练与预测速度更快。
&&&&svmscale.exe的用法:svmscale.exe feature.txt feature.scaled
默认的归一化范围是[-1,1],可以用参数-l和-u分别调整上界和下届,feature.txt是输入特征文件名&输出的归一化特征名为feature.scaled
3)&考虑选用RBF&核函数
训练数据形成模型(model),实质是算出了wx&#43;b=0中的w,b.
&svmtrain的用法:svmtrain [options] training_set_file [model_file]
其中options涵义如下:
-s svm类型:设置SVM&类型,默认&#20540;为0,可选类型有:
0 -- C- SVC
1 -- nu - SVC
2 -- one-class-SVM
3 -- e - SVR
4 -- nu-SVR
-t&核函数类型:设置核函数类型,默认&#20540;为2,可选类型有:
0 --&线性核:u'*v
1 --&多项式核:(g*u'*v&#43; coef0)degree
2 -- RBF&核:exp(-||u-v||*||u-v||/g*g)
3 -- sigmoid&核:tanh(g*u'*v&#43; coef 0)
-d degree:核函数中的degree设置,默认&#20540;为3;
-g r(gama):核函数中的函数设置(默认1/ k);
-r coef 0:设置核函数中的coef0,默认&#20540;为0;
-c cost:设置C- SVC、e - SVR、n - SVR中从惩罚系数C,默认&#20540;为1;
-n nu&:设置nu - SVC、one-class-SVM&与nu - SVR&中参数nu&,默认&#;
-p e&:核宽,设置e - SVR的损失函数中的e&,默认&#20540;为0.1;
-m cachesize:设置cache内存大小,以MB为单位(默认40):
-e e&:设置终止准则中的可容忍偏差,默认&#20540;为0.001;
-h shrinking:是否使用启发式,可选&#20540;为0&或1,默认&#20540;为1;
-b&概率估计:是否计算SVC或SVR的概率估计,可选&#20540;0&或1,默认0;
-wi weight:对各类样本的惩罚系数C加权,默认&#20540;为1;
-v n:n折交叉验证模式。
其中-g选项中的k是指输入数据中的属性数。操作参数&-v&随机地将数据剖分为n&部分并计算交叉检验准确度和均方根误差。以上这些参数设置可以按照SVM&的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM&类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认&#20540;。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。举个例子如下:
利用libsvm里面自带的癌症数据:
os.chdir(‘/home/huangjiaheng/下载/libsvm-3.21/python’)
#当退出python的时候需要重新执行此操作,即使sys.path.append('/home/huangjiaheng/下载/libsvm-3.21/python')也是不可以,具体#原因暂时未知
from svmutil import *
y, x = svm_read_problem(‘../heart_scale’)
#利用前200个数据做训练数据来求参数
m = svm_train(y[:200], x[:200], ‘-c 4’)
#得到结果:
optimization finished,
#iter = 257
nu = 0.351161
obj = -225.628984, rho = 0.636110
nSV = 91, nBSV = 49
Total nSV = 91
#iter为迭代次数,
nu&与前面的操作参数-n nu&相同,
obj为SVM文件转换为的二次规划求解得到的最小&#20540;,
rho&为判决函数的常数项b,
nSV&为支持向量个数,
nBSV为边界上的支持向量个数,
Total nSV为支持向量总个数。
训练后的模型保存为文件*.model,用记事本打开其内容如下:
svm_type c_svc&%&训练所采用的svm类型,此处为C- SVC
kernel_type rbf&%训练采用的核函数类型,此处为RBF核
gamma 0.0769231&%设置核函数中的g&,默认&#20540;为1/ k
nr_class 2&%分类时的类别数,此处为两分类问题
total_sv 132&%总共的支持向量个数
rho 0.424462&%决策函数中的常数项b
label 1 -1%类别标签
nr_sv 64 68&%各类别标签对应的支持向量个数
SV&%以下为支持向量
4)采用交叉验证选择最佳参数C与g
&&&&通常而言,比较重要的参数是&gamma (-g)&跟&cost (-c)&。而&cross validation (-v)
的参数常用5。那么如何去选取最优的参数c和g呢?libsvm&的&python&子目录下面的&grid.py&可以帮助我们。&此时。其中安装python2.5需要(一般默认安装到c:/python25
下),将gnuplot解压。安装解压完毕后,进入/libsvm/tools目录下,用文本编辑器(记事
本,edit都可以)修改grid.py文件,找到其中关于gnuplot路径的那项(其默认路径为
gnuplot_exe=r&c:/tmp/gnuplot/bin/pgnuplot.exe&),根据实际路径进行修改,并保存。然
后,将grid.py和C:/Python25目录下的python.exe文件拷贝到libsvm/windows目录下,键入以下命令:$ python grid.py train.1.scale&执行后,即可得到最优参数c和g。
&&&&另外,至于下libsvm和python的接口的问题,在libsvm2.86中林老师已经帮助我们解决,在/libsvm/windows/python目录下自带了svmc.pyd这个文件,将该文件文件复制到
libsvm/python目录下,同时,也将python.exe文件复制到该目录下,键入以下命令以检验效
果(注意:.Py文件中关于gnuplot路径的那项路径一定要根据实际路径修改):
python svm_test.py
&&&&如果能看到程序执行结果,说明libsvm和python之间的接口已经配置完成,以后就可以直接在python程序里调用libsvm的函数了!
5)&采用最佳参数C与g&对整个训练集进行训练获取支持向量机模型
&&&$ svmtrain –c x –g x –v x training_set_file [model_file]
&&&x为上述得到的最优参数c和g的&#20540;,v的&#20540;一般取5。
6)利用获取的模型进行测试与预测
使用Svmtrain训练好的模型进行测试。输入新的X&#20540;,给出SVM预测出的Y&#20540;
&$ Svmpredict&&test_file&&model_file&&output_file
如:./svm-predict&heart_scale&heart_scale.model&heart_scale.out
Accuracy = 86.6667% (234/270) (classification)
这里显示的是结果
一个具体使用的例子。
p_label, p_acc, p_val = svm_predict(y[200:], x[200:], m)
数据&#26684;式转换技巧:
其实这个软件就是一个excel工作薄,没什么奇特,打开它就会跳出来一个对话框,选“启用宏”就行了,其他不用管它,把你要的数据拷上去就好了,但是注意下&#26684;式,网上帖子也很多,照他们说的办吧。
1,先运行FormatDataLibsvm.xls然后将数据粘贴到sheet1的topleft单元。
&&&2,再&工具&--&&宏&--&执行下面有一个选项(FormatDatatoLibsvm)--&执行,要选中这个然后运行就可以了&,这时数据转换的问题就解决了,可是现在生成的数据是.xls&#26684;式,它还是不能做为libsvm的训练文件啊!还需要怎么转换呢?
3,可以copy到一个记事本中即可。但是注意在用libsvm的时候要在命令行输入.txt后缀。&
注意,宏安全性应当设置为中或者低。输入数据的&#26684;式是
条件属性a&&条件属性b&&...&&决策属性
7&&&&5&&&&...&&2
4&&&&2&&&&...&&1
输出数据&#26684;式是
决策属性&&条件属性a&&条件属性b&&...
2&&&&1:7&&&&2:5&&&&...
1&&&&1:4&&&&2:2&&&&...&
P.S.在第2步时,执行下面还有另一个选项(FormatDatafromLibsvm)这个可以把libsvm数据的&#26684;式重新转回来,转到你第1步时刚拷贝到excel里的数据形式
1). libSVM的数据&#26684;式
Label 1: value 2:value ….
Label: 是类别的标识, 比如上节train.model中提到的1 -1, 你可以自己随意定, 比如-10, 0, 15. 当然, 如果是回归, 这是目标&#20540;, 就要实事求是了.
Value: 就是要训练的数据, 从分类的角度来说就是特征&#20540;, 数据之间用空&#26684;隔开.
比如: -15 1:0.708 2:.3333
需要注意的是, 如果特征&#20540;为0, 特征冒号前面的(姑且称做序号)可以不连续. 如:
-15 1:0.708 3:-0.3333
表明第2个特征&#20540;为0, 从编程的角度来说, 这样做可以减少内存的使用, 并提高做矩阵内积时的运算速度. 我们平时在matlab中产生的数据都是没有序号的常规矩阵, 所以为了方便最好编一个程序进行转化.
2). svmscale的用法
svmscale是用来对原始样本进行缩放的, 范围可以自己定, 一般是[0,1]或[-1,1]. 缩放的目的主要是
1) 防止某个特征过大或过小, 从而在训练中起的作用不平衡;
2) 为了计算速度. 因为在核计算中, 会用到内积运算或exp运算, 不平衡的数据可能造成计算困难.
用法: svmscale [-l lower] [-u upper]
&&&&&&&&&&&&& [-y y_lower y_upper]
&&&&&&&&&&&&& [-s save_filename]
&&&&&&&&&&&&& [-r restore_filename] filename
其中, []中都是可选项:
&&&&&&&& -l: 设定数据下限; lower: 设定的数据下限&#20540;, 缺省为-1
&&&&&&&& -u: 设定数据上限; upper: 设定的数据上限&#20540;, 缺省为1
&&&&&&&& -y: 是否对目标&#20540;同时进行缩放; y_lower为下限&#20540;, y_upper为上限&#20540;;
&&&&&&&& -s save_filename: 表示将缩放的规则保存为文件save_
&&&&&&&& -r restore_filename: 表示将按照已经存在的规则文件restore_filename进行缩放;
&&&&&&&& filename: 待缩放的数据文件, 文件&#26684;式按照libsvm&#26684;式.
默认情况下, 只需要输入要缩放的文件名就可以了: 比如(已经存在的文件为test.txt)
&&&&&&&& svmscale test.txt
这时, test.txt中的数据已经变成[-1,1]之间的数据了. 但是, 这样原来的数据就被覆盖了, 为了让规划好的数据另存为其他的文件, 我们用一dos的重定向符&来另存为(假设为out.txt):
&&&&&&&& svmscale test.txt & out.txt
运行后, 我们就可以看到目录下多了一个out.txt文件, 那就是规范后的数据. 假如, 我们想设定数据范围[0,1], 并把规则保存为test.range文件:
&&&&&&&& svmscale –l 0 –u 1 –s test.range test.txt & out.txt
这时, 目录下又多了一个test.range文件, 可以用记事本打开, 下次就可以用-r test.range来载入了.
3). svmtrain的用法
svmtrain我们在前面已经接触过, 他主要实现对训练数据集的训练, 并可以获得SVM模型.
用法: svmtrain [options] training_set_file [model_file]
其中, options为操作参数, 可用的选项即表示的涵义如下所示:
-s 设置svm类型:
&&&&&&&& 0 – C-SVC
&&&&&&&& 1 – v-SVC
&&&&&&&& 2 – one-class-SVM
&&&&&&&& 3 – ε-SVR
&&&&&&&& 4 – n – SVR
-t 设置核函数类型, 默认&#20540;为2
& &&&&&&&0 — 线性核: μ‘*ν
&&&&&&&& 1 — 多项式核: & &(γ*μ‘*ν&#43;coef0)degree
&&&&&&&& 2 — RBF核: exp(–γ*∥μ-ν∥2)
&&&&&&&& 3 — sigmoid 核: tanh(γ*μ‘*ν&#43;coef0)
-d degree: 核函数中的degree设置(针对多项式核函数)(默认3);
-g r(gama): 核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/ k);
-r coef0: 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0);
-c cost: 设置C-SVC, e -SVR和v-SVR的参数(损失函数)(默认1);
-n nu: 设置v-SVC, 一类SVM和v- SVR的参数(默认0.5);
-p p: 设置e -SVR 中损失函数p的&#20540;(默认0.1);
-m cachesize: 设置cache内存大小, 以MB为单位(默认40);
-e eps: 设置允许的终止判据(默认0.001);
-h shrinking: 是否使用启发式, 0或1(默认1);
-wi weight: 设置第几类的参数C为weight*C (C-SVC中的C) (默认1);
-v n: n-fold交互检验模式, n为fold的个数, 必须大于等于2;
-b 概率估计: 是否计算SVC或SVR的概率估计, 可选&#, 默认0;
model_file: 可选项, 为要保存的结果文件, 称为模型文件, 以便在预测时使用.
其中-g选项中的k是指输入数据中的属性数. option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差. 以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合, 如果设置的参数在函数或SVM类型中没有也不会产生影响, 程序不会接受该参数; 如果应有的参数设置不正确, 参数将采用默认&#20540;.
training_set_file是要进行训练的数据集; model_file是训练结束后产生的模型文件, 文件中包括支持向量样本数, 支持向量样本以及lagrange系数等必须的参数; 该参数如果不设置将采用默认的文件名, 也可以设置成自己惯用的文件名.
默认情况下, 只需要给函数提供一个样本文件名就可以了, 但为了能保存结果, 还是要提供一个结果文件名, 比如: test.model, 则命令为:
&&& svmtrain test.txt test.model
4). svmpredict 的用法
svmpredict 是根据训练获得的模型, 对数据集合进行预测.
用法: svmpredict [options] test_file model_file output_file
其中, options为操作参数, 可用的选项即表示的涵义如下所示:
-b probability_estimates: 是否需要进行概率估计预测, 可选&#20540;为0 或者1, 默认&#20540;为0.
model_file: 是由svmtrain 产生的模型文件;
test_file: 是要进行预测的数据文件, &#26684;式也要符合libsvm&#26684;式, 即使不知道label的&#20540;, 也要任意填一个, svmpredict会在output_file中给出正确的label结果, 如果知道label的&#20540;, 就会输出正确率;
output_file: 是svmpredict 的输出文件, 表示预测的结果&#20540;.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:226次
排名:千里之外

我要回帖

更多关于 libsvm训练 的文章

 

随机推荐