一、参数说明

English

libsvm_options:

-s svm_type : set type of SVM (default 0)

0 -- C-SVC
        1 -- nu-SVC
        2 -- one-class SVM
        3 -- epsilon-SVR
        4 -- nu-SVR
-t kernel_type : set type of kernel function (default 2)
        0 -- linear: u'*v
        1 -- polynomial: (gamma*u'*v + coef0)^degree
        2 -- radial basis function: exp(-gamma*|u-v|^2)
        3 -- sigmoid: tanh(gamma*u'*v + coef0)
        4 -- precomputed kernel (kernel values in training_instance_matrix)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/k)
-r coef0 : set coef0 in kernel function (default 0)
-c cost : set the parameter C of C-SVC, epsilon-SVR, and nu-SVR (default 1)
-n nu : set the parameter nu of nu-SVC, one-class SVM, and nu-SVR (default

0.5)
-p epsilon : set the epsilon in loss function of epsilon-SVR (default 0.1)
-m cachesize : set cache memory size in MB (default 100)
-e epsilon : set tolerance of termination criterion (default 0.001)
-h shrinking: whether to use the shrinking heuristics, 0 or 1 (default 1)
-b probability_estimates: whether to train a SVC or SVR model for

probability estimates, 0 or 1 (default 0)
-wi weight: set the parameter C of class i to weight*C, for C-SVC (default

1)
-v n: n-fold cross validation mode
==========================================================
Chinese:
Options:可用的选项即表示的涵义如下
  -s svm类型:SVM设置类型(默认0)
  0 -- C-SVC
  1 --v-SVC
  2 – 一类SVM
  3 -- e -SVR
  4 -- v-SVR
  -t 核函数类型:核函数设置类型(默认2)
  0 – 线性:u'v
  1 – 多项式:(r*u'v + coef0)^degree
  2 – RBF函数:exp(-gamma|u-v|^2)
  3 –sigmoid:tanh(r*u'v + 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的值(默认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
  其中-g选项中的k是指输入数据中的属性数。option -v 随机地将数据剖分为n部

分并计算交互检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函

数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影

响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。

二、核函数

-t kernel_type : set type of kernel function (default 2)
        0 -- linear: u'*v
        1 -- polynomial: (gamma*u'*v + coef0)^degree
        2 -- radial basis function: exp(-gamma*|u-v|^2)
        3 -- sigmoid: tanh(gamma*u'*v + coef0)

但有时我们需要使用自己的核函数,这时候可以用 -t 4参数来实现:

-t kernel_type : set type of kernel function (default 2)
        4 -- precomputed kernel (kernel values in training_instance_matrix)

使用-t 4参数时,再有了核函数后,需要给出核矩阵,关于核函数以及核函数构造相关的知识,大家可以看看相关书籍,在此不特别深入说明。

比如线性核函数 是 K(x,x') = (x * x'),设训练集是train_data,设训练集有150个样本 , 测试集是test_data,设测试集有120个样本
则 训练集的核矩阵是 ktrain1 = train_data*train_data' 
     测试集的核矩阵是 ktest1 = test_data*train_data'
想要使用-t 4参数还需要把样本的序列号放在核矩阵前面 ,形成一个新的矩阵,然后使用svmtrain建立支持向量机,再使用svmpredict进行预测即可。形式与使用其他-t参数少有不同,如下:

ktrain1 = train_data*train_data';

Ktrain1 = [(1:150)',ktrain1];

model_precomputed1 = svmtrain(train_label, Ktrain1, '-t 4');  % 注意此处的 输入 Ktrain1

ktest1 = test_data*train_data';

Ktest1 = [(1:120)', ktest1];

[predict_label_P1, accuracy_P1, dec_values_P1] = svmpredict(test_label,Ktest1,model_precomputed1); % 注意此处输入Ktest1

Remark:注意上面注释部分部分。

下面是一个整体的小例子,大家可以看一下:

%% Use_precomputed_kernelForLibsvm_example
% faruto
% last modified by 2011.04.20
%%
tic;
clear;
clc;
close all;
format compact;
%%
load heart_scale.mat;
% Split Data
train_data = heart_scale_inst(1:150,:);
train_label = heart_scale_label(1:150,:);
test_data = heart_scale_inst(151:270,:);
test_label = heart_scale_label(151:270,:); %% Linear Kernel
model_linear = svmtrain(train_label, train_data, '-t 0');
[predict_label_L, accuracy_L, dec_values_L] = svmpredict(test_label, test_data, model_linear); %% Precomputed Kernel One
% 使用的核函数 K(x,x') = (x * x')
% 核矩阵
ktrain1 = train_data*train_data';
Ktrain1 = [(1:150)',ktrain1];
model_precomputed1 = svmtrain(train_label, Ktrain1, '-t 4');
ktest1 = test_data*train_data';
Ktest1 = [(1:120)', ktest1];
[predict_label_P1, accuracy_P1, dec_values_P1] = svmpredict(test_label, Ktest1, model_precomputed1); %% Precomputed Kernel Two
% 使用的核函数 K(x,x') = ||x|| * ||x'||
% 核矩阵
ktrain2 = ones(150,150);
for i = 1:150
for j = 1:150
ktrain2(i,j) = sum(train_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5;
end
end
Ktrain2 = [(1:150)',ktrain2];
model_precomputed2 = svmtrain(train_label, Ktrain2, '-t 4'); ktest2 = ones(120,150);
for i = 1:120
for j = 1:150
ktest2(i,j) = sum(test_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5;
end
end
Ktest2 = [(1:120)', ktest2];
[predict_label_P2, accuracy_P2, dec_values_P2] = svmpredict(test_label, Ktest2, model_precomputed2);
%% Precomputed Kernel Three
% 使用的核函数 K(x,x') = (x * x') / ||x|| * ||x'||
% 核矩阵
ktrain3 = ones(150,150);
for i = 1:150
for j = 1:150
ktrain3(i,j) = ...
train_data(i,:)*train_data(j,:)'/(sum(train_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5);
end
end
Ktrain3 = [(1:150)',ktrain3];
model_precomputed3 = svmtrain(train_label, Ktrain3, '-t 4'); ktest3 = ones(120,150);
for i = 1:120
for j = 1:150
ktest3(i,j) = ...
test_data(i,:)*train_data(j,:)'/(sum(test_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5);
end
end
Ktest3 = [(1:120)', ktest3];
[predict_label_P3, accuracy_P3, dec_values_P3] = svmpredict(test_label, Ktest3, model_precomputed3); %% Display the accuracy
accuracyL = accuracy_L(1) % Display the accuracy using linear kernel
accuracyP1 = accuracy_P1(1) % Display the accuracy using precomputed kernel One
accuracyP2 = accuracy_P2(1) % Display the accuracy using precomputed kernel Two
accuracyP3 = accuracy_P3(1) % Display the accuracy using precomputed kernel Three
%%
toc;

运行结果:

Accuracy = 85% (102/120) (classification)
Accuracy = 85% (102/120) (classification)
Accuracy = 67.5% (81/120) (classification)
Accuracy = 84.1667% (101/120) (classification)
accuracyL =
85
accuracyP1 =
85
accuracyP2 =
67.5000
accuracyP3 =
84.1667
Elapsed time is 1.424549 seconds.

于核函数这里多说一下,核函数的正确选取依赖产生分类问题的实际问题的特点,因为不同的实际问题对相似程度有着不同的度量,核函数可以看作一个特征提取的过程,选择正确的核函数有助于提高分类准确率。
核函数的构造可以直接构造,也可以通过变换来得到。

三、问答

Libsvm官方FAQ地址:
此处给出的是部分的中文翻译,方便大家使用。

中文翻译版:

问: 我在那里能够找到libsvm的文件 ?

软件包中有一个 README 文件,里面详细说明了所有参数选项、数据格式以及库函数的调用。在python目录下,模型选择工具和python界面的libsvm各有一个README文件。 初学者可以通过A practical guide to support vector classification了解如何训练和检验数据.论文LIBSVM : a library for support vector machines详细讨论了libsvm的使用.

 
 

 
问: 以前版本的libsvm都有什么变化?
详见变化日志. 你可以到这里下载以前版本的libsvm.
 
 
 
 
问:为什么有时我在training/model 文件中看不到所有的数据属性呢?W

libsvm应用了所谓的”稀疏“格式,这样零值就不用存储了。例如,有下面属性的数据

1 0 2 0
将被替换为: 1:1 3:2
 
 

 
问:如果我的数据是非数值型的,可以用libsvm吗?

目前libsvm只支持数值型的数据。因此,你必须将非数值型的转为数值型的数据。比如,你可以用二进制属性来替代原来的类别属性。

 
 
 
 
问:为什么要采用稀疏格式呢? 密集数据在训练时候会不会很慢?
这是个具有争议的话题。将系数向量赋值给核函数是比较慢的,因此总的训练时间至少是采用密集格式的2倍或3倍。但是,我们不支持密集格式的数据,因为我们不能够处理极度稀疏的数据。代码的简洁也是我们考虑的一个因素。目前我们决定只支持稀疏格式的数据。
 
 
 
 

问:怎样选择核函数?
通常我们建议你首先采用RBF核函数。Keerthi 和 Lin 的最近的研究(下载论文) 表明如果模型选择RBF的话,
就没有必要再考虑线性核函数了。采用sigmoid核函数的矩阵不一定会正有界,而且通常它的准确性也不如RBF(可参见Lin和Lin的论文此处下载). 多项式核函数还不错,但是如果度数很高的话,数值困难就会发生
(考虑到(<1)的d次幂会趋向0,(>1)的d次幂会趋向无穷)

 
 
 
 

问: libsvm是否可以用来专门处理线性SVM?D
不是的,目前libsvm用同样的方法处理线性/非线性SVMs. 注意:如果采用线性核函数,一些技巧可能会节省训练/检验的
时间。 因此libsvm对线性SVM并不时特别有效,尤其是采用很大的C的问题,这些问题数据的数值比其属性值要大得多。
你可以: 
仅用很大的C.下面的论文表明了:当C大于一个确定的阀值以后,判决函数是相同的。

S.S. Keerthi and C.-J. Lin. Asymptoticbehaviors of support vector machines with Gaussian kernel.NeuralComputation, 15(2003), 1667-1689.
尝试用bsvm,它有个对解决线性SVMs很有效的方法.你可以在下面的研究中找到更详细的内容: 
K.-M. Chung, W.-C. Kao, T. Sun, and C.-J. Lin. Decomposition Methods for Linear Support Vector Machines. NeuralComputation, 16(2004), 1689-1704.
另外,你并没必要一定要解决线性SVMs.你可以参考前面有关如何选取核函数的问题。

 
 
 
 

问:将属性值限制到[0,1],是否比限制到 [-1,1]有很大的不同?
对于线性规划方法,如果采用可RBF核函数并进行了参数的选择,两者是没什么不同的。假设Mi和mi分别代表第i个属性的
最大值和最小值.规划到[0,1]即:

x'=(x-mi)/(Mi-mi)对于[-1 1]:

x''=2(x-mi)/(Mi-mi)-1.在RBF核函数中:

x'-y'=(x-y)/(Mi-mi), x''-y''=2(x-y)/(Mi-mi).因此在[0,1]数据规划中用(C,g),和[-1 1]数据规划中用(C,g/2)是一样的。 
尽管性能相同,但是计算机时间可能不同。对于有许多零入口的数据, [0,1]规划保持了输入数据的稀疏特性,因此可能
会节省计算时间。

 
 
 
 

问: 我的数据是不平衡的,libsvm能解决这样的问题吗?
可以。libsvm有一个-wi选项。例如,你用: 
svm-train -s 0 -c 10 -w1 1 -w-1 5 data_file 则对类别“-1”的惩罚就较大。注意-w选项仅用在C-SVC中。

 
 
 
 

问: nu-SVC和C-SVC有什么不同之处?
除了参数不同外,两者基本是一样的。C-SVC中,C的范围是0到无穷,nu-SVC中C的范围是[0 1]。 nu一个很好的
特性是:它与支持向量的比率和训练误差的比率相关。

 
 
 
 

问:对于多分类SVM,libsvm采用的是什么方法 ? 为什么不用"1-against-the rest" 法 ?
对于多分类,我们采用的是1against 1法.我们的选择建立在以下对比的基础上: C.-W. Hsu and C.-J. Lin. A comparison of methods for multi-class support vector machinesIEEE Transactions on Neural Networks, 13(2002), 415-425. "1agains1the rest"是个很好的方法,而且分类效果
和"1-against-1."可以相比。但是我们采用后者,因为它训练的时间更短。

 
 
 
 

问:如果我想解决L2-svm 问题(即二次方误差项). 我应该怎样修改代码 ?
这十分简单. 以c-svc为例, 在svm.cpp中只要修改两个地方即可. 第一, 将solve_c_svc中的:

s.Solve(l, SVC_Q(*prob,*param,y), minus_ones, y,alpha, Cp, Cn, param->eps, si, param->shrinking);修改为:

s.Solve(l, SVC_Q(*prob,*param,y), minus_ones, y,alpha, INF, INF, param->eps, si, param->shrinking);第二:在SVC_Q类中, 声明C为私有变量:

double C;在构造(constructor)中,将它赋给param.C: 
this->C = param.C;在子程序get_Q中, 在for循环之后,添加:

if(i >= start && i < len)data += 1/C;对于一分类svm,以上修改完全一样。对于SVR,上面的if语句就没有必要了,你只要用一个简单的赋值语句即可:

data[real_i] += 1/C;

 
 
转自:http://www.matlabsky.com/thread-12380-1-1.html
   http://www.matlabsky.com/thread-15296-1-1.html
   http://www.matlabsky.com/thread-15225-1-1.html

 

libsvm参数学习和核函数使用(转载)的更多相关文章

  1. libsvm的安装,数据格式,常见错误,grid.py参数选择,c-SVC过程,libsvm参数解释,svm训练数据,libsvm的使用详解,SVM核函数的选择

    直接conda install libsvm安装的不完整,缺几个.py文件. 第一种安装方法: 下载:http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm. ...

  2. libsvm参数选择

    以前接触过libsvm,现在算在实际的应用中学习 LIBSVM 使用的一般步骤是: 1)按照LIBSVM软件包所要求的格式准备数据集: 2)对数据进行简单的缩放操作: 3)首要考虑选用RBF 核函数: ...

  3. libSVM 参数选择

    libSVM 参数选择  [预测标签,准确率,决策值]=svmpredict(测试标签,测试数据,训练的模型);    原文参考:http://blog.csdn.net/carson2005/art ...

  4. AspectJ基础学习之三HelloWorld(转载)

    AspectJ基础学习之三HelloWorld(转载) 一.创建项目 我们将project命名为:aspectjDemo.然后我们新建2个package:com.aspectj.demo.aspect ...

  5. AspectJ基础学习之一简介(转载)

    AspectJ基础学习之一简介(转载) 一.为什么写这个系列的博客   Aspectj一个易用的.功能强大的aop编程语言.其官网地址是:http://www.eclipse.org/aspectj/ ...

  6. [转]Python3之max key参数学习记录

    Python3之max key参数学习记录 转自https://www.cnblogs.com/zhangwei22/p/9892422.html 今天用Python写脚本,想要实现这样的功能:对于给 ...

  7. [转载]Python命令行参数学习

    转载自: http://blog.163.com/weak_time/blog/static/25852809120169333247925/ Python的命令行参数,提供了很多有用的功能,可以方便 ...

  8. 近200篇机器学习&深度学习资料分享【转载】

    编者按:本文收集了百来篇关于机器学习和深度学习的资料,含各种文档,视频,源码等.而且原文也会不定期的更新,望看到文章的朋友能够学到更多. <Brief History of Machine Le ...

  9. Shell学习笔记2》转载自runnoob

    学习且转载地址:http://www.runoob.com/linux/linux-shell-passing-arguments.html 这个网站整理的的确不错,看着很清晰,而且内容也很全面,个人 ...

随机推荐

  1. BestCoder Round #90 A.Kblack loves flag(随机数生成种子)

    A.Kblack loves flag [题目链接]A.Kblack loves flag [题目类型]水题 &题意: kblack喜欢旗帜(flag),他的口袋里有无穷无尽的旗帜. 某天,k ...

  2. php 二维数组排序,多维数组排序

    对2维数组或者多维数组排序是常见的问题,在php中我们有个专门的多维数组排序函数,下面简单介绍下: array_multisort(array1,sorting order, sorting type ...

  3. mybatis 中${}和#{}区别

    用#传入参数是,sql语句解析是会加上"",比如  select * from table where name = #{name} ,传入的name为小李,那么最后打印出来的就是 ...

  4. [AS3.0] HTMLLoader与js交互

    HtmlLoader 的属性window是加载到 HTML 控件中的内容的全局 JavaScript 对象,通过这个对象能够方便的和页面js通讯. AS代码: import flash.html.HT ...

  5. 【摘】 pt-query-digest工具一解

    原文 http://blog.csdn.net/seteor/article/details/24017913 1.percona-toolkit安装 wget http://www.percona. ...

  6. ldap实现用户认证

    LDAP的用户认证类. public class LDAPHelper { private DirectoryEntry _objDirectoryEntry; /// <summary> ...

  7. 安卓APP测试验证点总结

    最近较懒,加之闺女出生后记忆没完全恢复,总是忘东忘西,关于安卓APP测试的验证点还是总结一下,方便设计测试用例时查阅,也给各位博友参考! 1.除APP的正常功能点外,还有以下验证点: 安装/卸载(考虑 ...

  8. JS数组push会覆盖前面的数据问题

    这是一个作用域和重新赋值的问题. 检查声明数组所在位置,特别在是多层嵌套中,检查是否在内层循环结束时 跳到外层循环就重新将 数组 赋值为空.

  9. MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。

    CKagulaCEdit是CEdit的一个继承类,m_edit的CKagulaCEdit类型的一个变量 调用的时候,是这样的: 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,问题如下: 这时 ...

  10. float、double的有效位数

    Java中的浮点类型有两类,分别是float和double类型,其中float取_7__位有效数据,double取_15__位有效数据