基于libsvm实现文本分类
其实使用libsvm进行分类很简单,只需要有属性矩阵和标签,然后就可以建立分类模型(model),然后利用得到的这个model进行分类预测了。那神马是属性矩阵?神马又是标签呢?我举一个直白的不能在直白的例子:说一个班级里面有两个男生(男生1、男生2),两个女生(女生1、女生2),其中
如果我们将男生定义为1,女生定义为-1,并将上面的数据放入矩阵data中,即
1 2 3 4 |
data = [176 70; 180 80; 161 45; 163 47]; |
这样上面的data矩阵就是一个属性矩阵,行数4代表有4个样本,列数2表示属性有两个,label就是标签(1、-1表示有两个类别:男生、女生)。
1 |
label = [1;1;-1;-1]; |
现在回归正题,有了上面的属性矩阵data,和标签label就可以利用libsvm建立分类模型了,简要代码如下:
1 |
model = svmtrain(label,data); |
有了model我们就可以做分类预测,比如此时该班级又转来一个新学生,其身高190cm,体重85kg我们想通过上面这些信息就给出其标签(想知道其是男【1】还是女【-1】)比如 令 testdata = [190 85]; 由于其标签我们不知道,我们假设其标签为-1(也可以假设为1)
话归正传,即testdatalabel = -1;然后利用libsvm来预测这个新来的学生是男生还是女生,代码如下:
1 |
[predictlabel,accuracy] = svmpredict(testdatalabel,testdata,model) |
下面我们整体运行一下上面这段恶 搞[e gao]的背景数据和代码(你别笑,这个是真能运行的,也有结果的):
1 2 3 4 5 6 7 8 9 10 |
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 |
运行结果如下:
1 2 |
Accuracy = 0% (0/1) (classification) predictlabel = 1 |
哎,我们看到,通过预测我们得知这个新来的学生的标签是1(男生),由于原本我们假设其标签为-1,假设错误,所以分类准确率为0%。好,通过上面的讲解,不知道诸位看官对于利用libsvm进行分类是否有了一定了解【谁要是这么通俗的例子还搞不清楚怎么使用libsvm进行分类,那我真无语啦】,下面使用libsvm工具箱本身带的测试数据heart_scale来实际进行一下测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
%% HowToClassifyUsingLibsvm % by faruto @ faruto's Studio~ % http://blog.sina.com.cn/faruto % Email:faruto@163.com % 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; |
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
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 参数的说明请看libsvm 参数说明【中英文双语版本】http://www.matlabsky.com/thread-12380-1-1.html还有关于建立的分类模型model
1 2 3 4 5 6 7 8 9 10 11 |
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] |
发表评论