解密SVM系列(五):matlab下libsvm的简单使用:分类与回归

本节简介一下libsvm的用法。

关于libsvm似乎以前使用过。那个时候主要用libsvm进行简单的人脸识别实验。当时还翻译过关于libsvm里面的matlab英文文档

介绍与分类实验

那么如今最新版本号的libsvm为3.2.0,下载地址例如以下:

http://www.csie.ntu.edu.tw/~cjlin/libsvm/

下载下来的libsvm事实上包括好多个平台的工具箱软件,c++。matlab,java,python都有。

他们的函数用法是一样的。

那么在下载完以后,点击里面的matlab下平台,直接在点击里面的make.m函数就能够了。

正常情况下假设你的matlab含有编译平台的话直接就能够执行了,假设没有,还须要选择一个平台 mex -setup 。

小提醒一下,这个编译过程不要在c盘下使用,也就是libsvm先不要放在c盘,涉及到权限,机器不让编译。编译完后在matlab的设置路径中加入进去编译的目录及其内容,那么就能够使用了。

正常编译的过程是这种:

在上面的人脸识别实验中以前介绍过里面的主要函数,这里为了放在一块,把那里的拿过来吧:

眼下版LIBSVM(3.2.0)在matlab下编译完后仅仅有四个函数,libsvmread,Libsvmwrite,svmtrain(matlab自带的工具箱中有一个同名的函数),svmpredict。

(1)libsvmread主要用于读取数据

这里的数据是非matlab下的.mat数据,比方说是.txt,.data等等,这个时候须要使用libsvmread函数进行转化为matlab可识别数据,比方自带的数据是heart_scale数据。那么导入到matlab有两种方式,一种使用libsvmread函数。在matlab下直接libsvmread(heart_scale);另外一种方式为点击matlab的‘导入数据’button,然后导向heart_scale所在位置,直接选择就能够了。个人感觉另外一种方式超级棒。不管对于什么数据。比方你在哪个数据库下下载的数据,怎样把它变成matlab下数据呢?由于有的数据libsvmread读取不管用,可是‘导入数据’后就能够变成matlab下数据。

(2)libsvmwrite写函数。就是把已知数据存起来

使用方式为:libsvmwrite(‘filename’,label_vector, instance_matrix);

label_vector是标签,instance_matrix为数据矩阵(注意这个数据必须是稀疏矩阵,就是里面的数据不包括无用的数据(比方非常多0),有这种数据应该去掉再存)。

(3)svmtrain训练函数。训练数据产生模型的

一般直接使用为:model=svmtrain(label,data,cmd); label为标签,data为训练数据(数据有讲究,每一行为一个样本的全部数据,列数代表的是样本的个数),每个样本都要相应一个标签(分类问题的话一般为二分类问题,也就是每个样本相应一个标签)。cmd为相应的命令集合,都有哪些命令呢?非常多。-v,-t,-g,-c,等等,不同的參数代表的含义不同。比方对于分类问题。这里-t就表示选择的核函数类型,-t=0时线性核。-t=1多项式核。-t=2,径向基函数(高斯),-t=3,sigmod核函数,新版出了个-t=4。估计算核(还不会用)。-g为核函数的參数系数。-c为惩处因子系数,-v为交叉验证的数。默觉得5,这个參数在svmtrain写出来使用与不写出来不使用的时候,model出来的东西不一样。不写的时候,model为一个结构体。是一个模型,能够带到svmpredict中直接使用。写出来的时候,出来的是一个训练模型的准确率。为一个数值。普通情况下就这几个參数重要些,还有好多其它參数,能够自己參考网上比較全的,由于以下的这个方案的人脸识别就用到这么几个參数,其它的就不写了。

(3)svmpredict训练函数,使用训练的模型去预測来的数据类型

使用方式为:

[predicted_label,accuracy,decision_values/prob_estimates]= svmpredict(testing_label_vector,testing_instance_matrix,model,’libsvm_options’)

或者:

[predicted_label]=svmpredict(testing_label_vector,testing_instance_matrix, model, ‘libsvm_options’)

第一种方式中。输出为三个參数,预測的类型。准确率,评估值(非分类问题用着)。输入为測试类型(这个可与可无,假设没有。那么预測的准确率accuracy就没有意义了,假设有。那么就能够通过这个值与预測出来的那个类型值相比較得出准确率accuracy,可是要说明一点的是,不管这个值有没有,在使用的时候都得加上,即使没有,也要随便加上一个类型值,反正你也不管它对不正确,这是函数使用所规定的的),再就是输入数据值。最后是參数值(这里的參数值仅仅有两种选择,-p和-b參数)。以前遇到一个这种问题,比方说我在训练函数中规定了-g參数为0.1,那么在预測的时候是不是也要规定这个參数呢?当你规定了以后,程序反而错误,提醒没有svmpredict的-g參数,原因是在svmtrain后会出现一个model。而在svmpredict中你已经用了这个model,而这个model中就已经包括了你全部的训练參数了,所以svmpredict中没有这个參数。那么对于的libsvm_options就是-p和-b參数了。

对于函数的输出,两种方式调用的方法不一样,第一种调用把全部须要的数据都调用出来了。二另外一种调用。仅仅调用了predicted_label预測的类型,这里我们能够看到,在单纯的分类预測模型中,事实上另外一种方式更好一些吧,既简单有有用。

致此,四个函数在分类问题中的介绍大概如此,当然还有非常多能够优化的细节就不具体说了,比方能够再使用那些參数的时候,你假设不规定參数的话,全部的-參数都是使用默认的,默认的就可能不是最好的吧,这样就涉及到怎样去优化这个參数了。

使用就介绍到这里吧,以下实战一下,样本集选择前面使用的200个非线性样本集,函数例如以下:

%%
% * libsvm 工具箱简单使用
%
%% 载入数据
% * 终于data格式:m*n。m样本数,n维度
% * label:m*1  标签为-1与1这两类
clc
clear
close all
data = load(‘data_test1.mat‘);
data = data.data‘;
%选择训练样本个数
num_train = 80;
%构造随机选择序列
choose = randperm(length(data));
train_data = data(choose(1:num_train),:);
gscatter(train_data(:,1),train_data(:,2),train_data(:,3));
label_train = train_data(:,end);
test_data = data(choose(num_train+1:end),:);
label_test = test_data(:,end);
predict = zeros(length(test_data),1);
%% ----训练模型并预測分类
model = svmtrain(label_train,train_data(:,1:end-1),‘-t 2‘);
% -t = 2 选择径向基函数核
true_num = 0;
for i = 1:length(test_data)
    % 作为预測,svmpredict第一个參数随便给个就能够
    predict(i) = svmpredict(1,test_data(i,1:end-1),model);
end
%% 显示结果
figure;
index1 = find(predict==1);
data1 = (test_data(index1,:))‘;
plot(data1(1,:),data1(2,:),‘or‘);
hold on
index2 = find(predict==-1);
data2 = (test_data(index2,:))‘;
plot(data2(1,:),data2(2,:),‘*‘);
hold on
indexw = find(predict~=(label_test));
dataw = (test_data(indexw,:))‘;
plot(dataw(1,:),dataw(2,:),‘+g‘,‘LineWidth‘,3);
accuracy = length(find(predict==label_test))/length(test_data);
title([‘predict the testing data and the accuracy is :‘,num2str(accuracy)]);

能够看到,关于svm的部分就那么一点,其它的都是辅助吧,那么一个结果例如以下:

数据人为设置了一些重叠,这个结果算是非常好了。当然对于libsvm函数,里面还有很多细节,像參数选择等等。不同的參数结果是不一样的,这就待你去探究了。

至此SVM系列文章就到这里吧,感谢能看到这里的朋友~_~。

回归实验

回归问题不像分类问题。回归问题相当于依据训练样本训练出一个拟合函数一样。能够依据这个拟合函数能够来预測给定一个样本的输出值。能够看到分类问题输出的是样本所属于的类。而回归问题输出的是样本的预測值。

经常使用的地方典型的比方股票预測。人口预測等等此类预測问题。

libsvm相同能够进行回归预測,所须要改变的仅仅是里面的參数设置。查看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)
-d degree : set degree in kernel function (default 3)
-g gamma : set gamma in kernel function (default 1/num_features)
-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)

能够看到-s svm_type 控制的就是训练类型,而当-s等于3或4的时候,就是回归模型SVR。

-s 3 就是经常使用的带惩处项的 SVR模型。我们用这个实验。

我使用的是libsvm3.2.0工具箱,版本号不同可能会带来调用方式的不同。測试实验的代码例如以下。可能会有一些细节须要自己去探索:

close all;
clear;
clc;
%%
% 生成待回归的数据
x = (-1:0.1:1)‘;
y = -100*x.^3 + x.^2 - x + 1;
% 加点噪声
y = y+ 20*rand(length(y),1);
%% 採用交叉验证选择參数
mse = 10^7;
for log2c = -10:0.5:3,
    for log2g = -10:0.5:3,
        % -v 交叉验证參数:在训练的时候须要。測试的时候不须要,否则出错
        cmd = [‘-v 3 -c ‘, num2str(2^log2c), ‘ -g ‘, num2str(2^log2g) , ‘ -s 3 -p 0.4 -t 3‘];
        cv = svmtrain(y,x,cmd);
        if (cv < mse),
            mse = cv; bestc = 2^log2c; bestg = 2^log2g;
        end
    end
end
%%  训练--
cmd = [‘-c ‘, num2str(2^bestc), ‘ -g ‘, num2str(2^bestg) , ‘ -s 3 -p 0.4 -n 0.1‘];
model = svmtrain(y,x,cmd);
% model
% 利用建立的模型看其在训练集合上的回归效果
% 注意libsvm3.2.0的svmpredict函数必须有三个參数输出
[py,~,~] = svmpredict(y,x,model);
figure;
plot(x,y,‘o‘);
hold on;
plot(x,py,‘g+‘);
%%
% 进行预測新的x值
%-- 产生[-1 1]的随机数
testx = -2+(2-(-2))*rand(10,1);
testy = zeros(10,1);% 理论y值无所谓
[ptesty,~,~] = svmpredict(testy,testx,model);
hold on;
plot(testx,ptesty,‘r*‘);
legend(‘原始数据‘,‘回归数据‘,‘新数据‘);
grid on;
% title(‘t=0:线性核‘)
% title(‘t=1:多项式核‘)
% title(‘t=2:径向基函数(高斯)‘)
title(‘t=3:sigmod核函数‘)

这里我随机生成一个3次函数的随机数据,測试了几种不同svm里面的核函数:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb24yd2F5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描写叙述" title="">

由于我们的数据是由三次函数模拟生成的,所以能够看到。在这种情况下使用线性核t=0时候效果更好,然而实际情况下一般我们也不知道数据的分布函数,所以在选择核函数的时候还是须要多实验,找到最适合自己数据的核函数。

这里採用了交叉验证的方式自适应选择模型中重要的两个參数,须要注意的是參数的范围,不要太大。步长可能也须要控制。否则在数据量非常大的时候须要执行非常久。

时间: 2024-08-08 16:30:31

解密SVM系列(五):matlab下libsvm的简单使用:分类与回归的相关文章

解密SVM系列(五):matlab下libsvm的简单使用

本节简单介绍一下libsvm的使用方法.关于libsvm似乎曾经使用过,那个时候主要用libsvm进行简单的人脸识别实验.当时还翻译过关于libsvm里面的matlab英文文档 那么现在最新版本的libsvm为3.2.0,下载地址如下: http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 下载下来的libsvm其实包含好多个平台的工具箱软件,c++,matlab,java,python都有.他们的函数使用方法是一样的. 那么在下载完以后,点击里面的matlab下平

解密SVM系列(一):关于拉格朗日乘子法和KKT条件

写在之前 支持向量机(SVM),一个神秘而众知的名字,在其出来就受到了莫大的追捧,号称最优秀的分类算法之一,以其简单的理论构造了复杂的算法,又以其简单的用法实现了复杂的问题,不得不说确实完美. 本系列旨在以基础化的过程,实例化的形式一探SVM的究竟.曾经也只用过集成化的SVM软件包,效果确实好.因为众人皆说原理复杂就对其原理却没怎么研究,最近经过一段时间的研究感觉其原理还是可以理解,这里希望以一个从懵懂到略微熟知的角度记录一下学习的过程. 其实网络上讲SVM算法的多不胜数,博客中也有许多大师级博

解密SVM系列(二):SVM的理论基础

上节我们探讨了关于拉格朗日乘子和KKT条件.这为后面SVM求解奠定基础,本节希望通俗的细说一下原理部分. 一个简单的二分类问题例如以下图: 我们希望找到一个决策面使得两类分开.这个决策面一般表示就是WTX+b=0,如今的问题是找到相应的W和b使得切割最好.知道logistic分类 机器学习之logistic回归与分类的可能知道,这里的问题和那里的一样.也是找权值.在那里,我们是依据每个样本的输出值与目标值得误差不断的调整权值W和b来求得终于的解的.当然这样的求解最优的方式仅仅是当中的一种方式.那

S3C2416裸机开发系列十五_GCC下uCOS的移植(1)

S3C2416裸机开发系列十五 GCC下uCOS的移植(1) 象棋小子    1048272975 操作系统是用来管理系统硬件.软件及数据资源,控制程序运行,并为其它应用软件提供支持的一种系统软件.根据不同的种类,又可分为实时操作系统.桌面操作系统.服务器操作系统等.对于一些小型的应用,对系统实时性要求高,硬件资源有限等的情况下,应尽量避免使用复杂庞大的操作系统(如Linux),使用小型的实时操作系统(如uCOS)更能满足应用的需求.笔者此处就uCOS-II的移植作一个简单的介绍. 1. 代码准

S3C2416裸机开发系列十五_GCC下uCOS的移植(2)

S3C2416裸机开发系列十五 GCC下uCOS的移植(2) 象棋小子    1048272975 4. uCOS配置 uCOS是可裁减实时操作系统,可以根据实际的应用对内核未使用到的功能进行裁减,以进一步节省系统宝贵的硬件资源,通常可用的uCOS-II内核代码在6K~26K,这在uCOS-II配置文件os_cfg.h中进行配置,这个配置文件在源码目录为os_cfg_r.h,从目录中拷贝添加到uCOS/uCOS-II/Cfg目录中,并重命名为os_cfg.h. #ifndef OS_CFG_H

4.Java 加解密技术系列之 HMAC

Java 加解密技术系列之 HMAC 序 背景 正文 代码 结束语 序 上一篇文章中简单的介绍了第二种单向加密算法 — —SHA,同时也给出了 SHA-1 的 Java 代码.有这方面需求的童鞋可以去参考一下.今天这篇文章将要介绍第三种单向加密算法 — — HMAC,其实,这种加密算法并不是那么常用,最起码,在我写系列博客之前,我是没有听说过它的.当然,这并不是说 HMAC 不出名,肯定是我孤落寡闻了. 背景 之所以在单向加密算法中介绍 HMAC 这种“不常见的”算法,一是因为“没见过”,二是因

MATLAB安装libsvm无法使用解决办法(转)

buaasuozi  这是原作者: 安装libsvm 不成功有可能是你的MATLAB版本或者是编译文件版本的问题,但是不要急着换其他版本....说不定就有别的解决办法呢 首先感谢Lin教授及其实验室提供的libsvm工具箱,原始下载地址:下载主页:http://www.csie.ntu.edu.tw/~cjlin/libsvm/       下载地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/#download 原本我使用的是libsvm-3.01版本,但

64位matlab中libsvm的安装

因为windows版的matlab对编译器的识别不好.所以直接在网上下了已经编译好的libsvm文件放入toolbox文件夹就可以用libsvm了 libsvm已编译好的文件下载地址: 猛戳我下载 1.把下载好的文件放入*/matlab/toolbox中 2.在matlab中set path.把"*\Matlab 2013b\toolbox\libsvm-3.18\matlab"加入到path中 over 64位matlab中libsvm的安装,布布扣,bubuko.com

支持向量机(SVM)(五)-- SMO算法详解

一.我们先回顾下SVM问题. A.线性可分问题 1.SVM基本原理: SVM使用一种非线性映射,把原训练            数据映射到较高的维.在新的维上,搜索最佳分离超平面,两个类的数据总可以被超平面分开. 2.问题的提出: 3.如何选取最优的划分直线f(x)呢? 4.求解:凸二次规划 建立拉格朗日函数: 求偏导数: B.线性不可分问题 1.核函数 如下图:横轴上端点a和b之间红色部分里的所有点定为正类,两边的黑色部分里的点定为负类. 设: g(x)转化为f(y)=<a,y> g(x)=