libsvm3.2.1 - SVM多分类简单实现

来源:互联网 发布:南风知我意2书包网 编辑:程序博客网 时间:2024/06/05 07:34
首先,感谢湾湾的林教授提供的libsvm。

1.安装配置到matlab

-------据说直接将libsvm-3.21\windows目录添加到工作路径下即可(点击 set path/设置路径)------
我这里比较曲折,还是选择了编译:
(1)将工具包放到任何地方均可,将工具包目录(libsvm-3.21主目录)添加到Matlab的搜索路径。Set Path->add with subfolders->save
(2)命令行输入: mex    -setup
        选择C++和vs2010(本机是vs2010)
(3)工作目录进入到libsvm-3.21/matlab,然后命令行输入:make
(4)命令行输入下面代码进行测试:
clear;
[label_vector, instance_matrix] =libsvmread('heart_scale');
model = svmtrain(label_vector, instance_matrix);
[predicted_label, accuracy, prob_estimates] = svmpredict(label_vector, instance_matrix, model, 'b');

(可能会有的5)如果出现Invalid MEX-file 'xxxxxxwindows\libsvmread.mexw64': 找不到指定的模块。
就把matlab下的mex文件复制到windows下全部替换即可。
然后会得到正确的测试结果(是对根目录下的heart_scale进行的分析):

*
optimization finished, #iter = 162
nu = 0.431029
obj = -100.877288, rho = 0.424462
nSV = 132, nBSV = 107
Total nSV = 132
Accuracy = 86.6667% (234/270) (classification)

2.一个简单的多分类举例
clear;
%特征矩阵P
P=[ 1.2587    3.0761    5.7015    6.1477   15.1897    7.7739   14.2143;
    1.2571    3.0689    5.6749    6.1243   12.1949    7.7471   14.1543;
    1.2500    3.0573    5.5977    6.0389   12.1936    7.6527   13.9888;
    1.2614    3.0766    5.7234    6.2063   12.4628    7.8395   14.2903;
    1.2286    2.9109    6.9023    6.9904   14.1145    8.4769   16.7414;
    1.2302    2.9137    7.0011    7.0589   14.3808    8.5464   16.9477;
    1.2196    2.8861    6.8574    6.9408   17.1837    8.4172   16.7242;
    1.2330    2.9174    7.1085    7.0621   19.4943    8.5501   17.7029;
    1.4921    3.7987    7.7451    9.6659   21.4369   11.9287   19.6565;
    1.4874    3.7724    7.7934    9.6719   18.4340   11.9552   19.6265;
    1.4897    3.7882    7.7478    9.7091   18.7744   12.0021   19.5958;
    1.4985    3.8281    7.8391    9.7699   20.2503   11.9822   20.0870];
%因变量向量T,可以看到有3种不同的结果-1 0 1
T=[-1;-1;-1;-1;0;0;0;0;1;1;1;1];

model=svmtrain(T,P,'-c 1 -g 2');

%
测试特征集
P_test=[1.2623    3.0930    5.7050    6.1484   12.0869    7.7779   14.1668;
     1.2368    2.9332    6.9929    7.1641   18.2425    8.6719   16.9154;
     1.4915    3.7762    7.8288    9.6141   18.6441   11.8890   19.4717];
%测试结果集
 T_test = [-1;0;1];

[predict_label, accuracy, dec_values] = svmpredict(T_test, P_test, model);

就会得到输出:
.*
optimization finished, #iter = 14
nu = 0.622717
obj = -2.593508, rho = 0.204546
nSV = 7, nBSV = 1
.*
optimization finished, #iter = 15
nu = 0.617369
obj = -2.562849, rho = 0.186915
nSV = 7, nBSV = 1
.*
optimization finished, #iter = 14
nu = 0.771043
obj = -3.083852, rho = -0.015390
nSV = 8, nBSV = 0
Total nSV = 11
Accuracy = 100% (3/3) (classification)


一个重要的PS: 当测试集没有预定结果的时候,也就是说,我们只是想用模型对一堆特征集分类而不是验证模型准确度时,将T置为任意值(但长度需要对应上特征集的大小)即可。
这时打印predict_label就会显示分类器输出的分类结果。
0 0
原创粉丝点击