libsvm总结

1. 训练

格式:

model = libsvmtrain(training_label_vector, training_instance_matrix [, 'libsvm_options']);

这个函数有三个参数,其中

  • -training_label_vector:训练样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。这里可以是二分类和多分类,类标是(-1,1)、(1,2,3)或者其他任意用来表示不同的类别的数字,要转成double类型。
  • -training_instance_matrix:训练样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
  • -libsvm_options:训练的参数,在第3点详细介绍。

libsvmtrain函数返回训练好的SVM分类器模型model是一个结构体,包含以下成员:

  • -Parameters: 一个5 x 1的矩阵,从上到下依次表示:
        -s SVM类型(默认0);
        -t 核函数类型(默认2)
        -d 核函数中的degree设置(针对多项式核函数)(默认3);
        -g 核函数中的r(gamma)函数设置(针对多项式/rbf/sigmoid核函数) (默认类别数目的倒数);
        -r 核函数中的coef0设置(针对多项式/sigmoid核函数)((默认0)
  • -nr_class: 表示数据集中有多少类别,比如二分类时这个值即为2。
  • -totalSV: 表示支持向量的总数。
  • -rho: 决策函数wx+b中的常数项的相反数(-b)。
  • -Label: 表示数据集中类别的标签,比如二分类常见的1和-1。
  • -ProbA: 使用-b参数时用于概率估计的数值,否则为空。
  • -ProbB: 使用-b参数时用于概率估计的数值,否则为空。
  • -nSV: 表示每类样本的支持向量的数目,和Label的类别标签对应。如Label=[1; -1],nSV=[63; 67],则标签为1的样本有63个支持向量,标签为-1的有67个。
  • -sv_coef: 表示每个支持向量在决策函数中的系数。
  • -SVs: 表示所有的支持向量,如果特征是n维的,支持向量一共有m个,则为m x n的稀疏矩阵。

另外,如果在训练中使用了-v参数进行交叉验证时,返回的不是一个模型,而是交叉验证的分类的正确率或者回归的均方根误差。

当构建完成model后,还要为上述参数选择合适的值,方法主要有Gridsearch,其他的感觉不常用,Gridsearch说白了就是穷举。

 

网格参数寻优函数(分类问题):SVMcgForClass

   [bestCVaccuracy,bestc,bestg]=SVMcgForClass(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,accstep)

输入:

  • train_label:训练集的标签,格式要求与svmtrain相同。
  • train:训练集,格式要求与svmtrain相同。
  • cmin,cmax:惩罚参数c的变化范围,即在[2^cmin,2^cmax]范围内寻找最佳的参数c,默认值为cmin=-8,cmax=8,即默认惩罚参数c的范围是[2^(-8),2^8]。
  • gmin,gmax:RBF核参数g的变化范围,即在[2^gmin,2^gmax]范围内寻找最佳的RBF核参数g,默认值为gmin=-8,gmax=8,即默认RBF核参数g的范围是[2^(-8),2^8]。
  • v:进行Cross Validation过程中的参数,即对训练集进行v-fold Cross Validation,默认为3,即默认进行3折CV过程。 
  • cstep,gstep:进行参数寻优是c和g的步进大小,即c的取值为2^cmin,2^(cmin+cstep),…,2^cmax,,g的取值为2^gmin,2^(gmin+gstep),…,2^gmax,默认取值为cstep=1,gstep=1。
  • accstep:最后参数选择结果图中准确率离散化显示的步进间隔大小([0,100]之间的一个数),默认为4.5。

输出:

  • bestCVaccuracy:最终CV意义下的最佳分类准确率。
  • bestc:最佳的参数c。
  • bestg:最佳的参数g。

 

网格参数寻优函数(回归问题):SVMcgForRegress

  [bestCVmse,bestc,bestg]=SVMcgForRegress(train_label,train,cmin,cmax,gmin,gmax,v,cstep,gstep,msestep)

其输入输出与SVMcgForClass类似,这里不再赘述。


SVM 怎样能得到好的结果

1.   对数据做归一化(simple scaling)

2.   应用 RBF kernel 

3.   用cross-validation和grid-search 得到最优的c和g

4.   用得到的最优c和g训练训练数据

5.   测试


 

关于svm的C以及核函数参数设置----------------------


C一般可以选择为:10^t , t=- 4..4就是0.0001 到10000

 选择的越大,表示对错误例惩罚程度越大,可能会导致模型过拟合

 

在LIBSVM中-t用来指定核函数类型(默认值是2)。

0)线性核函数

(无其他参数)

1)多项式核函数

(重点是阶数的选择,即d,一般选择1-11:1 3 5 7 9 11,也可以选择2,4,6…)

2)RBF核函数

(径向基RBF内核,exp{-|xi-xj|^2/均方差},其中均方差反映了数据波动的大小。

参数通常可选择下面几个数的倒数:0.1 0.2 0.4 0.6 0.8 1.6 3.2 6.4 12.8,默认的是类别数的倒数,即1/k,2分类的话就是0.5)

3)sigmoid核函数 又叫做S形内核

两个参数g以及r:g一般可选1 2 3 4,r选0.2 0.4 0.60.8 1

4)自定义核函数

 

与核函数相对应的libsvm参数:

1)对于线性核函数,没有专门需要设置的参数

2)对于多项式核函数,有三个参数。-d用来设置多项式核函数的最高此项次数,也就是公式中的d,默认值是3。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。

3)对于RBF核函数,有一个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。

4)对于sigmoid核函数,有两个参数。-g用来设置核函数中的gamma参数设置,也就是公式中的第一个r(gamma),默认值是1/k(k是类别数)。-r用来设置核函数中的coef0,也就是公式中的第二个r,默认值是0。


2. 预测

格式:

[predicted_label, accuracy, decision_values/prob_estimates] 
    = libsvmpredict(testing_label_vector, testing_instance_matrix, model [, 'libsvm_options']);

这个函数包括四个参数,其中

  • -testing_label_vector:测试样本的类标,如果有m个样本,就是m x 1的矩阵(类型必须为double)。如果类标未知,可以初始化为任意m x 1的double数组。
  • -testing_instance_matrix:测试样本的特征,如果有m个样本,每个样本特征是n维,则为m x n的矩阵(类型必须为double)。
  • -model:使用libsvmtrain返回的模型
  • -libsvm_options:预测的参数,与训练的参数形式一样。

libsvmpredict函数有三个返回值,不需要的值在Matlab可以用 ~ 进行代替。

  • -predicted_label:第一个返回值,表示样本的预测类标号。
  • -accuracy:第二个返回值,一个3 x 1的数组,表示分类的正确率、回归的均方根误差、回归的平方相关系数。
  • -decision_values/prob_estimates:第三个返回值,一个矩阵包含决策的值或者概率估计。对于n个预测样本、k类的问题,如果指定“-b 1”参数,则n x k的矩阵,每一行表示这个样本分别属于每一个类别的概率;如果没有指定“-b 1”参数,则为n x k*(k-1)/2的矩阵,每一行表示k(k-1)/2个二分类SVM的预测结果。

3. 训练的参数

LIBSVM训练时可以选择的参数很多,包括:

  • -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 r(gamma):核函数中的gamma函数设置(针对多项式/rbf/sigmoid核函数)(默认1/k,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)
  • -wi weight:设置第几类的参数C为weight*C (C-SVC中的C) (默认1)
  • -v n: n-fold交互检验模式,n为fold的个数,必须大于等于2

以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合,如果设置的参数在函数或SVM类型中没有也不会产生影响,程序不会接受该参数;如果应有的参数设置不正确,参数将采用默认值。

4. 读取或保存

libsvmread函数可以读取以LIBSVM格式存储的数据文件。

[label_vector, instance_matrix] = libsvmread(‘data.txt’);

这个函数输入的是文件的名字,输出为样本的类标和对应的特征。

libsvmwrite函数可以把Matlab的矩阵存储称为LIBSVM格式的文件。

libsvmwrite(‘data.txt’, label_vector, instance_matrix]

这个函数有三个输入,分别为保存的文件名、样本的类标和对应的特征(必须为double类型的稀疏矩阵)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Head First设计模式》第三章笔记 装饰者模式

装饰者模式(Decorator Pattern) *利用组合(composition)和委托(delegation)可以在运行时实现继承行为的效果,动态地给对象加上新的行为。 *利用继承扩展子类的行为,是在编译时静态决定的&#x…

机器学习中如何解决数据不平衡问题?

文章目录目录什么是数据不平衡问题?数据不平衡会造成什么影响?如何处理数据不平衡问题?1、重新采样训练集1.1随机欠抽样1.2.基于聚类的过采样2.使用K-fold交叉验证3.转化为一分类问题4.组合不同的重采样数据集5.用不同比例重新采样6.多模型Ba…

《Head First设计模式》第四章笔记 工厂模式

之前我们一直在使用new操作符,但是实例化这种行为并不应该总是公开的进行,而且初始化经常会造成耦合问题,工厂模式将摆脱这种复杂的依赖,本次内容包括简单工厂,工厂方法和抽象工厂三种情况。 1 2 3 4 5 6 Duck duck&a…

《Head First设计模式》第五章笔记-单件模式

单件模式 定义:确保一个类只有一个实例,并提供全局访问点。 编写格式: 1 2 3 4 5 6 public class MyClass{ private MyClass(){}//构造方法私有化 public static MyClass getInstance(){ //提供全局访问点 return new My…

处理机器学习大数据的7种方法

文章目录目录1.分配更多的内存2.使用较小的样本3.将数据提交至服务器上4.更改数据格式5.使用数据流方式或者逐行读入的方法6.使用关系数据库7.使用大数据平台目录 在实际的生产过程中,我们经常会遇到数据文件太大,而无法直接读入到计算机中进行处理&…

《Head First设计模式》第六章笔记-命令模式

封装调用-命令模式 命令模式可将“动作的请求者”从“动作的执行者”对象中解耦。 本篇中将不再描述书中所引入的“巴斯特家电自动化公司”的遥控器控制案例,而使用简单易懂的餐厅案例。 在开始之前,让我们通过一个现实中的例子来了解命令模式。 理解…

kaggle(04)---avazu_ctr_predictor(baseline)

比赛的目的: 通过分析网上的系统日志和用户行为信息,来预测某些网页上项目的点击率。是一个二分类的问题,只需要预测出用户是否点击即可最好能够输出某个概率,比如:用户点击某个广告的概率。 比赛官网 文件信息&…

一文读懂机器学习库graphLab

文章目录目录什么是graphlab为什么使用graphlab?如何安装graphlab?graphlab的简单使用。目录 什么是graphlab GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架,框架使用C语言开发实…

《Head First设计模式》第七章-适配器模式、外观模式

适配器模式 适配器模式是什么,你一定不难理解,因为现实中到处都是。比如说: 如果你需要在欧洲国家使用美国制造的笔记本电脑,你可能需要使用一个交流电的适配器…… 当你不想改变现有的代码,解决接口不适配问题&#…

《Head First设计模式》第八章笔记-模板方法模式

模板方法模式 之前所学习的模式都是围绕着封装进行,如对象创建、方法调用、复杂接口的封装等,这次的模板方法模式将深入封装算法块,好让子类可以在任何时候都将自己挂接进运算里。 模板方法定义:模板方法模式在一个方法中定义一…

机器学习基础-吴恩达-coursera-(第一周学习笔记)----Introduction and Linear Regression

课程网址:https://www.coursera.org/learn/machine-learning Week 1 —— Introduction and Linear Regression 目录 Week 1 Introduction and Linear Regression目录一 介绍1-1 机器学习概念及应用1-2 机器学习分类 二 单变量的线性回归2-1 假设函数hypothesis2…

常见8种机器学习算法总结

简介 机器学习算法太多了,分类、回归、聚类、推荐、图像识别领域等等,要想找到一个合适算法真的不容易,所以在实际应用中,我们一般都是采用启发式学习方式来实验。通常最开始我们都会选择大家普遍认同的算法,诸如SVM&a…

redis——数据结构(字典、链表、字符串)

1 字符串 redis并未使用传统的c语言字符串表示,它自己构建了一种简单的动态字符串抽象类型。 在redis里,c语言字符串只会作为字符串字面量出现,用在无需修改的地方。 当需要一个可以被修改的字符串时,redis就会使用自己实现的S…

Hotspot虚拟机的对象

创建 Step1:类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 Step2:分…

剑指offer(刷题1-10)--c++,Python版本

文章目录目录第一题:解题思路:代码实现:c顺序查找二分查找Python第二题:解题思路:代码实现:cpython第三题:解题思路:代码实现:c使用栈辅助反转链表python第四题&#xff…

redis——数据结构(整数集合,压缩列表)

4、整数集合 整数集合(intset)是 Redis 用于保存整数值的集合抽象数据结构, 可以保存 int16_t 、 int32_t 、 int64_t 的整数值, 并且保证集合中不会出现重复元素。 实现较为简单: typedef struct intset {// 编码方…

原 剑指offer(刷题11-20)--c++,Python版本

文章目录目录第11题:解题思路:代码实现:cpython第12题:解题思路:代码实现:cpython第13 题:解题思路:代码实现:cpython第 14题:解题思路:代码实现&…

LRU介绍和实现

LRU全称是Least Recently Used,即最近最久未使用的意思。 LRU算法的设计原则是:如果一个数据在最近一段时间没有被访问到,那么在将来它被访问的可能性也很小。也就是说,当限定的空间已存满数据时,应当把最久没有被访问…

机器学习知识总结系列- 知识图谱(0-0)

文章目录目录机器学习知识图谱目录 本系列的文章只是根据个人的习惯进行总结,可能结构与一些书籍上不太一样,开始的内容比较简单,会随着后续的深入,不断丰富和更新图谱,同时也期待有相同兴趣的朋友一起给我留言一起丰富…

跳表介绍和实现

想慢慢的给大家自然的引入跳表。 想想,我们 1)在有序数列里搜索一个数 2)或者把一个数插入到正确的位置 都怎么做? 很简单吧 对于第一个操作,我们可以一个一个比较,在数组中我们可以二分,这…