用svm训练过程斗地主

LIBSVM 使用的一般步骤是:1)准备数据集,转化为 LIBSVM支持的数据格式 :[label] [index1]:[value1] [index2]:[value2] ...即 [l类别标号] [特征1]:[特征值] [特征2]:[特征值] ...2)对数据进行简单的缩放操作(scale);(为什么要scale,这里不解释了)3)考虑选用核函数(通常选取径函数,程序默认);4)采用交叉验证(一般采用5折交叉验证),选择最佳参数C与g ;5)用得到的最佳参数C与g 对整个训练集进行训练得到SVM模型;6)用得到的SVM模型进行测试
Libsvm&是一个简单的,易用的,高效的SVM分类和回归软件。它解决了 C-SVM 分类,nu-SVM 分类,one-class-SVM,epsilon-SVM 回归,nu-SVM 回归(的问题)。它也提供了一个自动的 C-SVM 分类的模型选择工具。本文档解释了 Libsvm 的用法。
Libsvm 的获取:http://www.csie.ntu.edu.tw/~cjlin/libsvm
请在使用&Libsvm 之前阅读 COPYRIGHT 文档。目录:=======================
- 快速开始- 安装与数据格式- 使用 &svm-train&- 使用 &svm-predict&- 使用 &svm-scale&- 实际应用的小贴士- 例子- 自定义核函数- 库的使用- Java 版本- 编译 Windows 二进制文件- 附加工具:Sub-sampling, Parameter Selection, Format checking, 等-&MATLAB/OCTAVE 接口- Python 接口- 补充快速开始=======================
如果你刚接触 SVM 并且数据不大,安装完毕之后请用 &tools' 文件夹下的 easy.py。它自动做好所有的事情&&从数据缩放到参数选择。
使用方法:easy.py training_file [testing_file]
有关参数选择的更多信息请参阅 &tools/README&。安装和数据格式=======================
在 Unix 系统中,键入 &make& &编译 &svm-train& 和 &smv-predict& 程序。运行程序时不设参数可以显示它们的用法。
在另一些系统中,查阅 &Makefile& 来编译它们( 例如,参阅本文档中的 &编译 Windows 二进制文件& )或者使用已编译的二进制文件( Windows 二进制文件在 &windows& 目录下 )。
训练数据和测试数据的文件格式如下:
&label& &index1&:&value1& &index2&:&value2& ...
每一行包括一个实例(样本)并以 &\n& 字符结束。对于分类,&label& 是一个整型数据,表示一个分类标签(支持多类分类)。对于回归,&label&&是一个可以为任意实数的目标值。对于&one-class&SVM,它不被使用,所以可取任意值。一对 &index&:&value& 提供一个特征(属性)值:&index& 是从 1 开始的整型数据,&value& 是一个实数。唯一的例外是自定义核函数,&index& 从 0 开始;参见自 &定义核函数& 部分。Indices 必须是单调增的顺序。测试文件中的 Labels 仅仅用于计算精度或误差。如果它们是未知量,只需在第一列任意填一个数。
本程序包中的一个已分类的数据的样本是 &heart_scale&。使用&tools/checkdata.py(细节参阅 &tools/README& )& 来检查你的数据是否为正确的格式。
键入 &svm-train heart_scale&,此程序会读入训练数据并且输出(建立好的)模型文件 &heart_scale.model&。如果你有一个命名为 &heart_scale.t& 的测试集,键入 &svm-predict heart_scale.t heart_scale.model output& 来观察预测精度。&output& 文件包含预测后的类别标签。
对于分类(问题),如果训练数据都是同一类(即,所有标签都一样),那么 'svm-train' 会出示一个警告信息:&Warning: training data in only one class. See README for details&,意味着训练数据是非常不平衡的。训练数据的 label 在测试的时候直接返回。
下面是本程序包中的其他的一些有用的程序:
svm-scale:&&&这是一个缩放输入数据文件的工具(其实就是把属性值归一化)。svm-toy:&&&这是一个简单的图形接口,它用一个平面展示 SVM 怎样将数据分开。你可以在窗口内点击来画出一些数据点,使用 &change& 按钮来选择类别 1,2,3(即,最多支持三个类别),&load& 按钮用来载入文件中的数据,&save& 按钮用来保存数据到一个文件,&run& 按钮用来得到一个 SVM 模型,&clear& 按钮来清空窗口。
你可以在窗口底端内输入选项,选项语法与 &svm-train& 相同。
注意,&load& 和 &save& 会考虑分类和回归情况中的密集数据格式。对于分类,每一个数据点有一个必须为1,2,3的 label(颜色)和两个在 [0,1)上的属性(x坐标和y坐标)。对于回归,每一个数据点有一个在 [0,1)上的目标值(y坐标)和一个在 [0,1)上属性(x坐标)。
分别在其各自的文件夹中键入&make&来编译它们。
你需要 Qt 库来编译 Qt 版本。从 http://www.trolltech.com 获取。你需要 GTK+ 库来编译 GTK 版本。从 http://www.gtk.org 获取。
预编译的 Windows 二进制文件在 &windows& 文件夹下。我们使用的是32位的机器上的 Visual C++,所以最大缓存
大小是2GB。
使用&svm-train&=======================
用法:svm-train [options] training_set_file [model_file]options:-s svm_type:设定SVM类型(默认为0)
&&&&&&&&0 -- C-SVC &&(多类分类)
&&&&&&&&1 -- nu-SVC &&(多类分类)
&&&&&&&&2 -- one-class SVM
&&&&&&&&3 -- epsilon-SVR &&(回归)
&&&&&&&&4 -- nu-SVR &&(回归)-t kernel_type:设定核函数类型(默认为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) sigmoid核函数
&&&&&&&&4 -- precomputed kernel (kernel values in training_set_file) 自定义核函数-d degree:设定核函数的 degree 值(默认为 3)-g gamma:设定核函数的 gamma 值(默认为 1/k)-r coef0:设定核函数的 coef0 值(默认为 0)-c cost:设定 C-SVC,epsilon-SVR,nu-SVR 的参数惩罚因子C值(默认为 1)
-n nu:设定 nu-SVC,one-class SVM,nu-SVR 的参数nu值(默认为 0.5)
-p epsilon:设定 epsilon-SVR 的损失函数中的&epsilon 值(默认为 0.1)
-m cachesize:设定缓存大小,以 MB 为单位(默认为 100)
-e epsilon:设定终止条件的允差(默认为 0.001)
-h shrinking:是否使用 shrinking heuristics(PS:这玩意太不好翻译),0 或 1(默认为 1)
-b probability_estimates:是否训练一个 SVC 或 SVR 模型做概率估计,0或1(默认为 0)
-wi weight : 对于 C-SVC,设定 i 类的参数 C 为 weight*C(默认为1)
-v n:n-折交叉验证模式
-q :退出模式(无输出)-g 选项中的的 k 为输入数据的属性数量。-v 选项随机截取数据为 n 个部分,计算它们的交叉验证的精度或者均方误差。关于输出的意义,参阅libsvm FAQ。使用&svm-predict&
=======================
用法:svm-predict [options] test_file model_file output_file
-b probability_estimates:是否预测概率估计,0或1(默认为 0);对于one-class SVM,仅支持 0。
model_file 是由 &svm-train& 产生的模型文件。
test_file 是你欲预测的测试数据。
output_file 是 &svm-predict& 产生的输出文件。使用&svm-scale&=======================
用法:svm-scale [options] data_filename
-l lower:x 缩放下限(默认为-1)
-u upper:x 缩放上限(默认为+1)
-y y_lower y_upper:y 缩放上下限(默认为不缩放)
-s save_filename:储存缩放参数到save_filename文件中
-r restore_filename:载入 restore_filename 中的缩放参数
例子请参阅本文件中的&Examples&。
实际应用的小贴士
=======================
* 缩放数据。例如,缩放每个属性为 [0,1] 或 [-1,+1]。
* 对于 C-SVC,可以考虑用&&tools& 文件夹下的模型选择工具。
* nu-SVC/one-class-SVM/nu-SVR 中的 nu 参数近似为训练误差和支持向量的比率。
* 如果要分类的数据是不平衡的(如,大正集和小负集),用 -wi 尝试不同的惩罚因子(参见下述例子)。
* 对于复杂问题,指定更大的缓存(即,larger -m)。
例子=======================
& svm-scale -l -1 -u 1 -s range train & train.scale
& svm-scale -r range test & test.scale缩放训练数据的每个特征值在 [-1,1] 内(训练数据文件为 train,缩放后的数据为 train.scale),缩放因子(就是一些参数)被存储在 range 文件中然后被用于缩放测试数据(测试数据文件为test,缩放后的数据为test.scale)。& svm-train -s 0 -c 5 -t 2 -g 0.5 -e 0.1 data_file用 RBF核函数 exp(-0.5|u-v|^2) 训练(data_file文件)得到一个分类器,C=10,终止允差为0.1。
& svm-train -s 3 -p 0.1 -t 0 data_file用 线性核函数 u'v 解决 SVM 回归(问题),损失函数中 epsilon=0.1。
& svm-train -c 10 -w1 1 -w2 5 -w4 2 data_file
训练一个分类器,对于 &1& 类 惩罚因子为 10= 1 * 10,对于 &2& 类 惩罚因子为 50 =&5 * 10,对于 &4& 类 惩罚因子为 20 = 2 * 10。
& svm-train -s 0 -c 100 -g 0.1 -v 5 data_file
对分类器用参数 C=100,gamma=0.1 做五折交叉验证。
& svm-train -s 0 -b 1 data_file
& svm-predict -b 1 test_file data_file.model output_file
用概率信息得到一个模型。用概率估计来预测测试数据。自定义核函数=======================
用户可以自定义核函数的值并输入它们作为训练和测试文件。之后 libsvm 不需要原始的训练和测试集。
假定有&L 个训练实体 x1, ..., xL。以 K(x, y) 做核函数中两个实体 x,y 的值,输入格式如下:
新训练实例 xi:
&label& 0:i 1:K(xi,x1) ... L:K(xi,xL)
新测试实例 任意 x:
&label& 0:? 1:K(x,x1) ... L:K(x,xL)
即,在训练文件中,第一列必须是 xi 的&ID&。在测试中,用&? 作为任意值。
所有核函数值包括 ZEROs 必须是明确提供的。训练和测试文件中任何随机的或排列的子集也有效(见下例)。
注意:格式与以前在 libsvmtools(文件夹)中发布的预定义核函数略有不同。
&&&&&&&&假定最初的训练数据有三个 4-feature 的实例,测试数据有一个实例:
&&&&&&&&15 &1:1 2:1 3:1 4:1
&&&&&&&&45 &&&&&&&2:3 &&&&&&4:3
&&&&&&&&25 &&&&&&&&&&&&&3:1
&&&&&&&&15 &1:1 &&&&&&3:1
&&&&&&&&如果用线性核函数,我们将得到如下新的训练和测试子集:
&&&&&&&&15 &0:1 1:4 2:6 &&3:1
&&&&&&&&45 &0:2 1:6 2:18 3:0
&&&&&&&&25 &0:3 1:1 2:0 &&3:1
&&&&&&&&15 &0:? 1:2 2:0 &3:1
&&&&&&&&? 可为任何值。
&&&&&&&&上面的训练文件的任何子集也是有效的。如,
&&&&&&&&25 &0:3 1:1 2:0 &3:1
&&&&&&&&45 &0:2 1:6 2:18 3:0
&&&&&&&&意味着核矩阵为:
&&&&&&&&&&&&&&&&[K(2,2) K(2,3)] = [18 0]
&&&&&&&&&&&&&&&&[K(3,2) K(3,3)] = [ 0 &1]
阅读(...) 评论()查看: 1763|回复: 5|关注: 1
SVM训练好之后,得到的分类器该如何调用
<h1 style="color:# 麦片财富积分
新手, 积分 17, 距离下一级还需 33 积分
本帖最后由 finnnnn 于
19:59 编辑
训练好之后,多了一个model分类器,如图所示, 我之后该怎么调用用这个分类器,去做目标的区分呢? 谢谢
<h1 style="color:# 麦片财富积分
本帖最后由 finnnnn 于
02:48 编辑
SVM训练好后,如何通过model,得到检测子?
<h1 style="color:# 麦片财富积分
svmpredict(r,tsx,low_model);
<h1 style="color:# 麦片财富积分
svmpredict(r,tsx,low_model);
我不是这个意思,这个我已经得到了。
<h1 style="color:# 麦片财富积分
你的问题解决了吗?
<h1 style="color:# 麦片财富积分
楼主问题解决了吗?我现在也是遇到这个问题,求赐教!
站长推荐 /3
MATLAB大数据处理与探查
MATLAB中文论坛是全球最大的 MATLAB & Simulink 中文社区。用户免费注册会员后,即可下载代码,讨论问题,请教资深用户及结识书籍作者。立即注册加入我们吧!
MATLAB官方社交平台
MATLAB中文论坛微社区8被浏览4,100分享邀请回答1添加评论分享收藏感谢收起15 条评论分享收藏感谢收起写回答SVM中的训练如何理解! 请大神教教_百度知道
SVM中的训练如何理解! 请大神教教
我有更好的答案
就是训练。最好参考比较权威的那本书,通过已知的一些数据通俗地说就是将自变量通过一个叫核函数的东西变成高维里的变量,和因变量形成之间形成线性关系,把线性关系的参数定下来,邓乃阳的数据挖掘中的新方法
为您推荐:
其他类似问题
您可能关注的内容
svm的相关知识
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。3893人阅读
svm、HMM、hog、Gobor、Gog高斯差分、小波变换(18)
#include &cv.h&
#include &highgui.h&
#include &ml.h&
#include&boost/tokenizer.hpp&
#include&boost/lexical_cast.hpp&
#include &iostream&
#include &fstream&
#include &string&
#include &vector&
#define WIDTH 20
#define HEIGHT 20
int main( )
vector&string& img_
vector&int& img_
ifstream svm_data( "/home/dz/data/label/train" );
string spath="/home/dz/data/imageS/";
char_separator&char& sep(";");
while( svm_data )
if( getline( svm_data, buf ) )
tokenizer&char_separator&char& & tokens(buf,sep);
tokenizer&char_separator&char& &::
it=tokens.begin();
img_path.push_back( spath+*it+".jpg" );++
img_catg.push_back( lexical_cast&int&(*it) );//atoi将字符串转换成整型,标志(0,1)
svm_data.close();//关闭文件
CvMat *data_mat, *res_
int nImgNum = img_path.size();
//读入样本数量
////样本矩阵,nImgNum:横坐标是样本数量, WIDTH * HEIGHT:样本特征向量,即图像大小
data_mat = cvCreateMat( nImgNum, WIDTH * HEIGHT, CV_32FC1 );
cvSetZero( data_mat );
//类型矩阵,存储每个样本的类型标志
res_mat = cvCreateMat( nImgNum, 1, CV_32FC1 );
cvSetZero( res_mat );
IplImage *srcImg, *sampleI
for( string::size_type i = 0; i != img_path.size(); i++ )
srcImg = cvLoadImage( img_path[i].c_str(), CV_LOAD_IMAGE_GRAYSCALE );
if( srcImg == NULL )
cout&&" can not load the image: "&&img_path[i].c_str()&&
cout&&" processing "&&img_path[i].c_str()&&
sampleImg = cvCreateImage( cvSize( WIDTH, HEIGHT ), IPL_DEPTH_8U, 1 );//样本大小(WIDTH, HEIGHT)
cvResize( srcImg, sampleImg );//改变图像大小
cvSmooth( sampleImg, sampleImg );
//生成训练数据
for( int ii = 0; ii & sampleImg-& ii++ )

我要回帖

更多关于 opencv svm训练 的文章

 

随机推荐