当前位置:首页 » 编程语言 » libsvmc语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

libsvmc语言

发布时间: 2022-09-01 22:46:17

‘壹’ matlab配置libsvm需要哪个版本的matlab了

我的libsvm 版本为目前最新的3.12版本,matlab版本为matlab R2011b,c/c++编译器为vs2010。提到c/c++编译器是因为matlab下安装使用libsvm需要c/c++编译器,具体matlab支持哪些版本的编译器,可以到matlab官网上查询。
安装配置过程具体如下:
1、设置matlab搜索工作目录:file->Set Path->Add With Subfolders,选择的目录为“..\libsvm-3.12”,选定后,点击save,然后close即可。

2、设置matlab的当前工作目录:设置Current Folder为“..\libsvm-3.12\matlab”。
3、选择c/c++编译器:Command Window里面输入mex -setup,当出现提示:Would you like mex to locate installed compilers [y]/n?时,选择y,接下来就要选择编译器,我这里出现的选项有:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2011b\sys\lcc
[2] Microsoft Visual C++ 2010 in d:\Program Files\Microsoft Visual Studio 10.0
[3] Microsoft Visual C++ 2005 SP1 in E:\vs2005

[0] None
我选择了2,出现提示语句:Are these correct [y]/n?,继续y之后,如果编译器选择成功,会出现:
Trying to update options file: C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2011b\mexopts.bat
From template: D:\PROGRA~1\MATLAB\R2011b\bin\win32\mexopts\msvc100opts.bat

Done . . .
3、编译:输入make命令,系统会生成如下4个文件:svmtrain.mexw32,svmpredict.mexw32,libsvmread.mexw32,libsvmwrite.mexw32。完成~

4、测试:使用 [heart_scale_label,heart_scale_inst] = libsvmread('../heart_scale');生成测试数据

model = svmtrain(heart_scale_label,heart_scale_inst);
[predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);
model =
Parameters: [5x1 double]
nr_class: 2
totalSV: 132
rho: 0.4245
Label: [2x1 double]
ProbA: []
ProbB: []
nSV: [2x1 double]
sv_coef: [132x1 double]
SVs: [132x13 double]
accuracy =
86.6667
0.5333
0.5326
测试通过,说明libsvm在matlab中已经可以使用~

‘贰’ libsvm 怎么训练多个变量

c语言版本的也记录在 model 里面.其中model 是一个结构体,其定义如下.

struct svm_model
{
struct svm_parameter param; // parameter
int nr_class; // number of classes, = 2 in regression/one class svm
int l; // total #SV
struct svm_node **SV; // SVs (SV[l])
double **sv_coef; // coefficients for SVs in decision functions (sv_coef[k-1][l])
double *rho; // constants in decision functions (rho[k*(k-1)/2])
double *probA; // pariwise probability information
double *probB;

// for classification only

int *label; // label of each class (label[k])
int *nSV; // number of SVs for each class (nSV[k])
// nSV[0] + nSV[1] + ... + nSV[k-1] = l
// XXX
int free_sv; // 1 if svm_model is created by svm_load_model
// 0 if svm_model is created by svm_train
};

里面的sv_coef就是指向 拉格朗日参数(可能乘了1或者-1)的指针的指针
=============
其实用Matlab版本的更方便

‘叁’ libsvm安装在哪个ide里面

一。下载libsvm
http://www.csie.ntu.e.tw/——cjlin/libsvm/
在libsvm的网站上下载 libsvm-3.12.zip文件,解压后放在任意目录下,最好放在MATLAB工具箱中,比如 C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12下。
二。配置编译器
打开 matlab,切换到C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12\matlab目录下,键入以下命令:
mex –setup
出现提示语句
Please choose your compiler for building MEX-files:
Would you like mex to locate installed compilers [y]/n?n %这次是选择编译器,输入n,选择自定义的编译器
出现以下选项(因电脑而异)
Select a compiler:
[1] Intel C++ 11.1 (with Microsoft Visual C++ 2008 SP1 linker)
[2] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 SP1 linker)
[3] Intel Visual Fortran 11.1 (with Microsoft Visual C++ 2008 Shell linker)
[4] Lcc-win32 C 2.4.1
[5] Microsoft Visual C++ 6.0
[6] Microsoft Visual C++ 2005 SP1
[7] Microsoft Visual C++ 2008 SP1
[8] Microsoft Visual C++ 2010
[9] Microsoft Visual C++ 2010 Express
[10] Open WATCOM C++
[0] None
Compiler: 8%可以用其他的,出现以下提示语句
Your machine has a Microsoft Visual C++ 2010 compiler located at
C:\Program Files\Microsoft Visual Studio 10.0. Do you want to use this compiler [y]/n?
编译器默认路径,确认正确输入y,更改路径,输入n
输入y出现再次确认
Please verify your choices:
Compiler: Microsoft Visual C++ 2010
Location: C:\Program Files\Microsoft Visual Studio 10.0
Are these correct [y]/n? y
编译器配置完成
Trying to update options file: C:\Documents and Settings\zhangokun\Application Data\MathWorks\MATLAB\R2011a\mexopts.bat
From template: C:\PROGRA——1\MATLAB\R2011a\bin\win32\mexopts\msvc100opts.bat
Done . . .
三。编译
输入命令
》 make

%编译完成
系统就会生成svmtrain.mexw32,svmpredict.mexw32,libsvmread.mexw32和libsvmwrite.mexw32等文件(对于 Matlab 7.1以下上版本,生成的对应文件为svmtrain.dll,svmpredict.dll和read_sparse.dll,没做测试),然后可以在matlab的菜单 File->Set Path->add with subfolders(可直接用Add Folder)里,把 C:\Program Files\MATLAB\R2011a\toolbox\libsvm-3.12\matlab目录添加进去,这样以后在任何目录下都可以调用 libsvm的函数了。
四。测试
为了检验 libsvm和 matlab之间的接口是否已经配置完成,可以在 matlab下执行以下命令:
》load heart_scale
完成该步骤后发现Workspace中出现了heart_scale_inst和 heart_scale_label,说明正确
》model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07‘);
》 [predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model); %
Accuracy = 86.6667% (234/270) (classification)% done
如果运行正常并生成了model这个结构体(其中保存了所有的支持向量及其系数),那么说明libsvm和matlab 之间的接口已经完全配置成功。
附:
如果你没有 heart_scale.mat(官方现在都不给了,给的都是VC++下的格式 所以load 会报错:heart_scale must be same as previous lines)
所以必须使用给的一个函数,转化数据此函数为libsvmread()
使用如下: [label_vector, instance_matrix] = libsvmread('filename’);
此处为了跟官方统一名称可以[heart_scale_label,heart_scale_inst] = libsvmread(‘heart_scale’);
由于heart_scale在libsvm-3.11目录下,不是在matlab下,所以直接用libsvmread命令会报错,要买改变当前路径,或者使用[heart_scale_label,heart_scale_inst] = libsvmread(‘/heart_scale’);/代表返回上层路径。
注意:
1. matlab自带了C编译器Lcc-win32C,但是libsvm原始版本是C++实现的,因此需要C++的编译器来编译,这就是不适用matlab默认编译器而选择其他C++编译器的原因。
matlab支持的编译器也是有限的,可以查看不同版本matlab支持的编译器列表
2. 如果matlab版本太低,如matlab 7.0是不能用VS作为编译器的,只能用VC++ 6.0
3. .mexw32 文件是经过加密的,打开是乱码,函数本身没有帮助。
例如输入 help svmpredict会出现报错: svmpredict not found
工具箱libsvm-3.12\matlab中README文件才是帮助文件。
但是输入help svmtrain会出现帮助信息,其实出现的是系统自带的svmtrain函数,没有libsvm工具箱中的好用。
4.在新版本libsvm3.12中,文件夹libsvm-3.12\windows中已经有编译好的程序,可以直接使用,只需要把libsvm-3.12\windows添加到matlab路径中即可,不需要编译的过程。当然最好还是自己编译一遍,因为编译环境不同会导致一些不可预估的小问题,自己编译的过程是可控的。
5. 测试用数据集,libsvm官网上提供了很多数据集
测试使用的heart_scale数据集是C++版本的(类标签 1:第一个属性 2:第二个属性…),可以用libsvmread来转换为matlab版本的(它们的区别在类标签)。
[label_vector, instance_matrix] = libsvmread(‘C++版本数据集’); %得到类标签和属性矩阵,然后可以使用它们训练了model = svmtrain(label_vector, instance_matrix);
》 load heart_scale
》 model = svmtrain(heart_scale_label,heart_scale_inst);
*
optimization finished, #iter = 162
nu = 0.431029
obj = -100.877288, rho = 0.424462
nSV = 132, nBSV = 107
Total nSV = 132
》 [predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);
Accuracy = 86.6667% (234/270) (classification)
6.参考资料
libsvm库下载:http://www.csie.ntu.e.tw/——cjlin/libsvm/
视频:http://v.youku.com/v_showMini/id_XMjc2NTY3MzYw_ft_131.html(有小问题,等下会提到)

‘肆’ 如何将数据转换libsvm格式文件

使用FormatDataLibsvm.xls。其实这个软件就是一个excel工作薄,先把office的宏安全性应当设置为中或者低。打开它就会跳出来一个对话框,选“启用宏”就行了,其他不用管它,把你要的数据拷上去就好了。
1,先运行FormatDataLibsvm.xls然后将数据粘贴到sheet1的topleft单元。
2,再"工具"-->"宏"-->执行下面有一个选项(FormatDatatoLibsvm)-->执行,要选中这个然后运行就可以了 ,这时数据转换的问题就解决了,可是现在生成的数据是.xls格式,它还是不能做为libsvm的训练文件啊!还需要怎么转换呢?
3,可以到一个记事本中即可。但是注意在用libsvm的时候要在命令行输入.txt后缀。

输入数据的格式是

条件属性a 条件属性b ... 决策属性
7 5 ... 2
4 2 ... 1

输出数据格式是

决策属性 条件属性a 条件属性b ...
2 1:7 2:5 ...
1 1:4 2:2 ...
P.S. 在第2步时,执行下面还有另一个选项(FormatDatafromLibsvm)这个可以把libsvm数据的格式重新转回来,转到你第1步时刚拷贝到excel里的数据形式。
或者自己写个MATLAB的程序,将自己常用的数据格式按照这种数据格式要求转换成这种格式供LIBSVM直接使用。
格式转换函数write2libsvm如下:

function write2libsvm
% 为了使得数据满足libsvm的格式要求而进行的数据格式转换
% 原始数据保存格式为:
% [标签 第一个属性值 第二个属性值...]
% 转换后文件格式为满足libsvm的格式要求,即:
% [标签 1:第一个属性值 2:第二个属性值 3:第三个属性值 ...]

[filename, pathname] = uigetfile( {'*.mat', ...
'数据文件(*.mat)'; '*.*', '所有文件 (*.*)'}, '选择数据文件');
try
S=load([pathname filename]);
fieldName = fieldnames(S);
str = cell2mat(fieldName);
B = getfield(S,str);
[m,n] = size(B);
[filename, pathname] = uiputfile({'*.txt;*.dat' ,'数据文件
(*.txt;*.dat)';'*.*','所有文件 (*.*)'},'保存数据文件');
fid = fopen([pathname filename],'w');
if(fid~=-1)
for k=1:m
fprintf(fid,'%3d',B(k,1));
for kk = 2:n
fprintf(fid,'\t%d',(kk-1));
fprintf(fid,':');
fprintf(fid,'%d',B(k,kk));
end
fprintf(fid,'\n');
end
fclose(fid);
else
msgbox('无法保存文件!');
end
catch
msgbox('文件保存过程中出错!','出错了...','error');
end

‘伍’ 有没有用c或c++实现svm算法

林智仁 的libsvm 就是C实现的SVM算法代码,回答不能带链接,你去搜一下libsvm就能找到了.你可以找到他的主页,上面还会有算法的具体介绍,和libsvm的使用. 这个估计是使用最广泛的求解svm的工具包. 里面的代码都是可以看的.
理论的话,july写的一篇文章很经典, 搜索 支持向量机通俗导论(理解SVM的三层境界) 就能找到.
另外看楼主是想学习人工智能算法的, 附加一个学习神经网络的网络, <神经网络之家> nnetinfo ,专讲神经网络的,还有相关视频.
都是本人学习过程了解到的干货, 望采纳.

‘陆’ 用libsvm如何得到每个样本的点到超平面的距离,网上找的资料都说在svm.cpp中加上一段代码,具体怎么加

你可以试试,matlab 版本的那个svm工具包,如果你对C不太熟悉的话

‘柒’ 哪位朋友能介绍一下支持向量机工具libsvm的用法

LIBSVM的简单介绍 2006-09-20 15:59:48
大 中 小
1. LIBSVM 软件包简介
LIBSVM 是台湾大学林智仁(Chih-Jen Lin)博士等开发设计的一个操作简单、易于使用、快速有效的通用SVM 软件包,可以解决分类问题(包括C- SVC、n - SVC )、回归问题(包括e - SVR、n - SVR )以及分布估计(one-class-SVM )等问题,提供了线性、多项式、径向基和S形函数四种常用的核函数供选择,可以有效地解决多类问题、交叉验证选择参数、对不平衡样本加权、多类问题的概率估计等。LIBSVM 是一个开源的软件包,需要者都可以免费的从作者的个人主页http://www.csie.ntu.e.tw/~cjlin/
处获得。他不仅提供了LIBSVM的C++语言的算法源代码,还提供了Python、Java、R、MATLAB、Perl、Ruby、LabVIEW以及C#.net 等各种语言的接口,可以方便的在Windows 或UNIX 平台下使用。另外还提供了WINDOWS 平台下的可视化操作工具SVM-toy,并且在进行模型参数选择时可以绘制出交叉验证精度的等高线图。
2. LIBSVM 使用方法简介
LibSVM是以源代码和可执行文件两种方式给出的。如果是Windows系列操作系统,可以直接使用软件包提供的程序,也可以进行修改编译;如果是Unix类系统,必须自己编译。
LIBSVM 在给出源代码的同时还提供了Windows操作系统下的可执行文件,包括:进行支持向量机训练的svmtrain.exe;根据已获得的支持向量机模型对数据集进行预测的svmpredict.exe;以及对训练数据与测试数据进行简单缩放操作的svmscale.exe。它们都可以直接在DOS 环境中使用。如果下载的包中只有C++的源代码,则也可以自己在VC等软件上编译生成可执行文件。

3. LIBSVM 使用的一般步骤是:
1) 按照LIBSVM软件包所要求的格式准备数据集;
2) 对数据进行简单的缩放操作;
3) 考虑选用RBF 核函数;
4) 采用交叉验证选择最佳参数C与g ;
5) 采用最佳参数C与g 对整个训练集进行训练获取支持向量机模型;
6) 利用获取的模型进行测试与预测。

4. LIBSVM使用的数据格式
1)训练数据和检验数据文件格式如下:
<label> <index1>:<value1> <index2>:<value2> ...
其中<label> 是训练数据集的目标值,对于分类,它是标识某类的整数(支持多个类);对于回归,是任意实数。<index> 是以1开始的整数,可以是不连续的;<value>为实数,也就是我们常说的自变量。检验数据文件中的label只用于计算准确度或误差,如果它是未知的,只需用一个数填写这一栏,也可以空着不填。
在程序包中,还包括有一个训练数据实例:heart_scale,方便参考数据文件格式以及练习使用软件。可以编写小程序,将自己常用的数据格式转换成这种格式

2)Svmtrain和Svmpredict的用法
LIBSVM软件提供的各种功能都是DOS命令执行方式。我们主要用到两个程序,svmtrain(训练建模)和svmpredict(使用已有的模型进行预测),下面分别对这两个程序的使用方法、各参数的意义以及设置方法做一个简单介绍:
(1)Svmtrain的用法:
svmtrain [options] training_set_file [model_file]
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(-r|u-v|^2)
3 –sigmoid:tanh(r*u'v + coef0)
-d degree:核函数中的degree设置(默认3)
-g 函数设置(默认1/ k)r(gama):核函数中的
-r coef0:核函数中的coef0设置(默认0)
-c cost:设置C-SVC, -SVR的参数(默认1)-SVR和
- SVR的参数(默认0.5)-SVC,一类SVM和-n nu:设置
-SVR-p e:设置的值(默认0.1)中损失函数
-m cachesize:设置cache内存大小,以MB为单位(默认40)
-e :设置允许的终止判据(默认0.001)
-h shrinking:是否使用启发式,0或1(默认1)
-wi C(C-SVC中的C)(默认1)weight:设置第几类的参数C为weight
-v n: n-fold交互检验模式
其中-g选项中的k是指输入数据中的属性数。option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差。以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。training_set_file是要进行训练的数据集;model_file是训练结束后产生的模型文件,文件中包括支持向量样本数、支持向量样本以及lagrange系数等必须的参数;该参数如果不设置将采用默认的文件名,也可以设置成自己惯用的文件名。
(2)Svmpredict的用法:
svmpredict test_file model_file output_file
model_file 是由svmtrain产生的模型文件;test_file是要进行预测的数据文件;Output_file是svmpredict的输出文件。svm-predict没有其它的选项。
下面是具体的使用例子
svmtrain -s 0 -c 1000 -t 1 -g 1 -r 1 -d 3 data_file
训练一个由多项式核(u'v+1)^3和C=1000组成的分类器。
svmtrain -s 1 -n 0.1 -t 2 -g 0.5 -e 0.00001 data_file =-SVM (在RBF核函数exp(-0.5|u-v|^2)和终止允许限0.00001的条件下,训练一个 0.1)分类器。 svmtrain -s 3 -p 0.1 -t 0 -c 10 data_file =以线性核函数u'v和C=10及损失函数 0.1求解SVM回归。

‘捌’ 如何在matlab里安装libsvm包

1.下载好libsvm包
下载libsvm-3.21到随意一个地方,比如到matlab安装路径下的 toolbox下——D:\MATLAB\R2014A\toolbox\下,并解压。
打开matlab,将libsvm-3.21\matlab 添加到路径,比如将:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab 添加到路径。
2.setup 第一次尝试
若提示没有C++编译器,则根据提示的网址去下载 winsdk_web.exe,然后 双击运行winsdk_web.exe,安装到最后若提示失败,则去卸载自带的visual studio 和 .netframework 4,然后再运行 winsdk_web.exe,提示缺少 .netframework 4,则自行下载安装,反复运行 winsdk_web.exe。
直到运行 winsdk_web.exe 时出现如下图所示情况,说明距成功更近一步了,

选择 Change,下一步,

勾选上 visual C++ compilers 和 microsoft visual C++ 2010,下一步,

最后提示成功安装。
2. setup
打开Matlab中,进入LIBSVM根目录下的matlab目录(如D:\MATLAB\R2014A\toolbox\libsvm-3.21),在命令窗口的输入mex -setup 输出为:
>>mex –setup

MEX 配置为使用 'Microsoft Windows SDK 7.1 (C)' 以进行 C 语言编译。
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the
new API. You can find more information about this at:

http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.
要选择不同的语言,请从以下选项中选择一种命令:
mex -setup C++
mex -setup FORTRAN

继续:
>> mex -setup C++
MEX 配置为使用 'Microsoft Windows SDK 7.1 (C++)' 以进行 C++ 语言编译。
Warning: The MATLAB C and Fortran API has changed to support MATLAB
variables with more than 2^32-1 elements. In the near future
you will be required to update your code to utilize the
new API. You can find more information about this at:
http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.

3.编译
执行 make,输出如下:
>> make
使用 'Microsoft Windows SDK 7.1 (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Windows SDK 7.1 (C)' 编译。
MEX 已成功完成。
使用 'Microsoft Windows SDK 7.1 (C++)' 编译。
找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmtrain.exp

找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmtrain.exp

MEX 已成功完成。
使用 'Microsoft Windows SDK 7.1 (C++)' 编译。
找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmpredict.exp

找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmpredict.exp

MEX 已成功完成。
>>

4.重命名
忽略错误(找不到……),继续,编译完成后,在当前目录下(libsvm-3.21/matlab下)会出现svmtrain.mexw64、svmpredict.mexw64 或者svmtrain.mexw32、svmpredict.mexw32 ,把文件名svmtrain和svmpredict 相应改成 libsvmtrain 和 libsvmpredict。
这是因为Matlab中自带有SVM的工具箱,其函数名字就是svmtrain和svmpredict,和 libsvm 默认的名字一样.
5.测试是否安装成功libsvm
libsvm 软件包中自带有测试数据,即软件包根目录下的 heart_scale 文件。
在matlab运行代码,输出如下:
>> [heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
>> model = libsvmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07');
*
optimization finished, #iter = 134
nu = 0.433785
obj = -101.855060, rho = 0.426412
nSV = 130, nBSV = 107
Total nSV = 130
>> [predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model);
Accuracy = 86.6667% (234/270) (classification)
>>

OK ,perfect ! Congratulations to you!
如果遇到:
>> [heart_scale_label, heart_scale_inst] = libsvmread('heart_scale');
Invalid MEX-file 'C:\Users\jiao\Documents\MATLAB\libsvm-3.20\matlab\libsvmread.mexw64': 找不到指定的模块。

则把 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab 文件夹添加到路径就可以了。

‘玖’ 如何使用libsvm进行分类

这帖子就是初步教教刚接触libsvm(svm)的同学如何利用libsvm进行分类预测,关于参数寻优的问题在这里姑且不谈,另有帖子详述。

其实使用libsvm进行分类很简单,只需要有属性矩阵和标签,然后就可以建立分类模型(model),然后利用得到的这个model进行分类预测了。

那神马是属性矩阵?神马又是标签呢?我举一个直白的不能在直白的例子:
说一个班级里面有两个男生(男生1、男生2),两个女生(女生1、女生2),其中
男生1 身高:176cm 体重:70kg;
男生2 身高:180cm 体重:80kg;

女生1 身高:161cm 体重:45kg;
女生2 身高:163cm 体重:47kg;
如果我们将男生定义为1,女生定义为-1,并将上面的数据放入矩阵data中,即

data = [176 70;

180 80;

161 45;

163 47];

复制代码
在label中存入男女生类别标签(1、-1),即

label = [1;1;-1;-1];

复制代码
这样上面的data矩阵就是一个属性矩阵,行数4代表有4个样本,列数2表示属性有两个,label就是标签(1、-1表示有两个类别:男生、女生)。

Remark:这里有一点废话一些(因为我看到不止一个朋友问我这个相关的问题):
上面我们将男生定义为1,女生定义为-1,那定义成别的有影响吗?
这个肯定没有影响啊!(用脚趾头都能想出来,我不知道为什么也会有人问),这里面的标签定义就是区分开男生和女生,怎么定义都可以的,只要定义成数值型的就可以。
比如我可将将男生定义为2,女生定义为5;后面的label相应为label=[2;2;5;5];
比如我可将将男生定义为18,女生定义为22;后面的label相应为label=[18;18;22;22];

为什么我说这个用脚趾头都能想怎么定义都可以呢?学过数学的应该都会明白,将男生定义为1,女生定义为-1和将男生定义为2,女生定义为5本质是一样的,应为可以找到一个映射将(2,5)转换成(1,-1),so所以本质都是一样的,后面的18、22本质也是一样的。
这里要多说一些,如果你原本的数据集合的标签不是数值型的(比如a、b、c)那么你完全可以通过某种转换映射将不是数值型的标签转换成数值型的。

现在回归正题,有了上面的属性矩阵data,和标签label就可以利用libsvm建立分类模型了,简要代码如下:

model = svmtrain(label,data);

复制代码
有了model我们就可以做分类预测,比如此时该班级又转来一个新学生,其
身高190cm,体重85kg
我们想通过上面这些信息就给出其标签(想知道其是男【1】还是女【-1】)
比如 令 testdata = [190 85]; 由于其标签我们不知道,我们假设其标签为-1(也可以假设为1)
Remark:这里又有一点废话一些(因为我看到不止一个朋友问我这个相关的问题):
如果测试集合的标签没有怎么办?测试集合的标签就应该没有,否则测试集合的标签都有了,还预测你妹啊!?没有是正确的,就像上面一样,新来的学生其标签咱不应知道,就想通过其属性矩阵来预测其标签,这才是预测分类的真正目的。
之所以平时做测试时,测试集合的标签一般都有,那是因为一般人们想要看看自己的分类器的效果如何,效果的评价指标之一就是分类预测的准确率,这就需要有测试集的本来的真实的标签来进行分类预测准确率的计算。

话归正传,即
testdatalabel = -1;

然后利用libsvm来预测这个新来的学生是男生还是女生,代码如下:

[predictlabel,accuracy] = svmpredict(testdatalabel,testdata,model)

复制代码
下面我们整体运行一下上面这段恶 搞[e gao]的背景数据和代码(你别笑,这个是真能运行的,也有结果的):

data = [176 70;

180 80;

161 45;

163 47];

label = [1;1;-1;-1];

model = svmtrain(label,data);

testdata = [190 85];

testdatalabel = -1;

[predictlabel,accuracy] = svmpredict(testdatalabel,testdata,model);

predictlabel

复制代码
运行结果如下:

Accuracy = 0% (0/1) (classification)

predictlabel =

1

复制代码
哎,我们看到,通过预测我们得知这个新来的学生的标签是1(男生),由于原本我们假设其标签为-1,假设错误,所以分类准确率为0%。

好,通过上面的讲解,不知道诸位看官对于利用libsvm进行分类是否有了一定了解【谁要是这么通俗的例子还搞不清楚怎么使用libsvm进行分类,那我真无语啦】,下面使用libsvm工具箱本身带的测试数据heart_scale来实际进行一下测试:
%% HowToClassifyUsingLibsvm

% by faruto @ faruto's Studio~

% http://blog.sina.com.cn/faruto

% Email:[email protected]

% http://www.MATLABsky.com

% http://www.mfun.la

% http://video.ourmatlab.com

% last modified by 2010.12.27

%% a litte clean work

tic;

close all;

clear;

clc;

format compact;

%%

% 首先载入数据

load heart_scale;

data = heart_scale_inst;

label = heart_scale_label;

% 选取前200个数据作为训练集合,后70个数据作为测试集合

ind = 200;

traindata = data(1:ind,:);

trainlabel = label(1:ind,:);

testdata = data(ind+1:end,:);

testlabel = label(ind+1:end,:);

% 利用训练集合建立分类模型

model = svmtrain(trainlabel,traindata,'-s 0 -t 2 -c 1.2 -g 2.8');

% 分类模型model解密

model

Parameters = model.Parameters

Label = model.Label

nr_class = model.nr_class

totalSV = model.totalSV

nSV = model.nSV

% 利用建立的模型看其在训练集合上的分类效果

[ptrain,acctrain] = svmpredict(trainlabel,traindata,model);

% 预测测试集合标签

[ptest,acctest] = svmpredict(testlabel,testdata,model);

%%

toc;

复制代码
运行结果:

model =

Parameters: [5x1 double]

nr_class: 2

totalSV: 197

rho: 0.0583

Label: [2x1 double]

ProbA: []

ProbB: []

nSV: [2x1 double]

sv_coef: [197x1 double]

SVs: [197x13 double]

Parameters =

0

2.0000

3.0000

2.8000

0

Label =

1

-1

nr_class =

2

totalSV =

197

nSV =

89

108

Accuracy = 99.5% (199/200) (classification)

Accuracy = 68.5714% (48/70) (classification)

Elapsed time is 0.040873 seconds.

>>

‘拾’ 请教libSVM中一类SVM训练及测试的参数设置问题

-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(-r|u-v|^2)
% 3 –sigmoid:tanh(r*u'v + coef0)
% 4 -- precomputed kernel (kernel values in training_instance_matrix)
% -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)