libsvm学习笔记

合集下载

libsvm参数说明

libsvm参数说明

libsvm参数说明【原创实用版】目录1.LIBSVM 简介2.LIBSVM 参数说明3.LIBSVM 的使用方法4.LIBSVM 的应用场景5.总结正文1.LIBSVM 简介LIBSVM(Library for Support Vector Machines)是一个开源的支持向量机(SVM)算法库,它提供了一系列用于解决分类和回归问题的高效算法。

LIBSVM 由 Chenning Peng 和 Tsung-Yuan Lee 开发,是 SVM 领域最为知名和广泛使用的工具之一。

2.LIBSVM 参数说明LIBSVM 包含了许多参数,这些参数可以影响模型的性能。

以下是一些重要的 LIBSVM 参数及其说明:- "kernel": 指定核函数类型,如"linear"(线性核)、"rbf"(高斯径向基函数核)等。

- "C": 指定惩罚参数 C,用于控制模型对训练数据的拟合程度。

较小的 C 值会导致更宽松的边界,可能允许一些误分类,但可以提高模型的泛化能力。

较大的 C 值则会强制模型在训练集上尽量减少误差,可能导致过拟合。

- "degree": 指定多项式核函数的阶数。

- "gamma": 指定高斯核函数的参数,用于控制核函数的形状。

- "coef0": 指定拉格朗日乘子 alpha 的初始值。

- " CacheSize": 指定 LIBSVM 使用的内存缓存大小。

3.LIBSVM 的使用方法使用 LIBSVM 主要包括以下步骤:(1)数据预处理:将数据集分为特征矩阵 X 和目标向量 y。

(2)训练模型:调用 LIBSVM 的 train 函数,传入预处理后的数据和参数设置,训练 SVM 模型。

(3)预测:使用训练好的模型,调用 LIBSVM 的 predict 函数,对新的数据进行分类预测。

libsvm参数说明

libsvm参数说明

libsvm参数说明(实用版)目录1.引言2.LIBSVM 简介3.LIBSVM 参数说明4.使用 LIBSVM 需要注意的问题5.结束语正文1.引言支持向量机(Support Vector Machine, SVM)是一种非常强大和灵活的监督学习算法,它可以用于分类和回归任务。

在 SVM 的研究和应用中,LIBSVM 是一个非常重要的工具,它为 SVM 的实现和应用提供了强大的支持。

本文将对 LIBSVM 的参数进行详细的说明,以帮助读者更好地理解和使用这个工具。

2.LIBSVM 简介LIBSVM 是一个开源的 SVM 实现库,它提供了丰富的功能和接口,可以支持多种操作系统,包括 Windows、Linux 和 Mac OS 等。

LIBSVM 主要包括三个部分:svm-train、svm-predict 和 svm-plot。

svm-train 用于训练 SVM 模型,svm-predict 用于预测新数据,svm-plot 用于绘制各种图表,以便于观察和分析模型性能。

3.LIBSVM 参数说明LIBSVM 的参数设置对于模型的性能至关重要。

以下是一些常用的参数及其说明:- -train:用于指定训练数据的文件名。

- -test:用于指定测试数据的文件名。

- -model:用于指定模型文件的名称。

- -参数:用于设置 SVM 模型的参数,例如 C、核函数等。

- -cache-size:用于设置缓存大小,以加速训练过程。

- -tolerance:用于设置收敛阈值,控制训练过程的终止条件。

- -shrinking:用于设置是否使用启发式方法进行训练。

- -probability:用于设置是否计算预测概率。

4.使用 LIBSVM 需要注意的问题在使用 LIBSVM 时,需要注意以下问题:- 设置合适的参数:LIBSVM 的参数设置对模型性能有很大影响,需要根据具体问题和数据集进行调整。

- 特征选择:在实际应用中,特征选择对于模型性能至关重要。

【机器学习】libsvm使用的数据格式

【机器学习】libsvm使用的数据格式

【机器学习】libsvm使⽤的数据格式该软件使⽤的训练数据和检验数据⽂件格式如下: <label> <index1>:<value1> <index2>:<value2> ... 其中<label> 是训练数据集的⽬标值,对于分类,它是标识某类的整数(⽀持多个类);对于回归,是任意实数。

<index> 是以1开始的整数,可以是不连续的;<value>为实数,也就是我们常说的⾃变量。

检验数据⽂件中的label只⽤于计算准确度或误差,如果它是未知的,只需⽤⼀个数填写这⼀栏,也可以空着不填。

在程序包中,还包括有⼀个训练数据实例:heart_scale,⽅便参考数据⽂件格式以及练习使⽤软件。

在NET.SVM中,Node和Problem类提供此项功能。

如果说我要定义如下数据集:+1 1:0.708333 2:1 3:1 4:-0.320755-1 1:0.583333 2:-1 3:0.333333 4:-0.603774+1 1:0.166667 2:1 3:-0.333333 4:-0.433962-1 1:0.458333 2:1 3:1 4:-0.358491可以先定义X的矩阵:private Node[][] _X;⼀组Y的数组private double[] _Y;然后再分别给_X和_Y赋值;当然,也可以⽤Problem类提供的⽅法来和来将数据直接读取到Problem中去。

Class NodeMember DescriptionDefault Constructor.Constructor.Compares this node with another.(Inherited from .)(Inherited from .)(Inherited from .)(Inherited from .)Index of this Node.(Inherited from .)String representation of this Node as {index}:{value}.(Overrides ..)Value at Index.Class ProblemMember DescriptionConstructor.Empty Constructor. Nothing is initialized.Number of vectors.(Inherited from .)(Inherited from .)(Inherited from .)(Inherited from .)Maximum index for a vector.(Inherited from .)Reads a problem from a stream.Reads a Problem from a file.(Inherited from .)Writes a problem to a stream.Writes a problem to a file. This will overwrite any previous data in the file. Vector data.Class labels.。

libsvm的使用

libsvm的使用

libsvm的使用发表于2012 年8 月 2 日1: 了解libsvm工具包LIBSVM是台湾大学林智仁(Lin Chih-Jen)教授等2001年开发设计的一个简单, 易于使用和快速有效的SVM模式识别与回归的软件包, 他不但提供了编译好的可在Windows系列系统的执行文件, 还提供了源代码, 方便改进, 修改以及在其它操作系统上应用; 该软件对SVM所涉及的参数调节相对比较少, 提供了很多的默认参数, 利用这些默认参数可以解决很多问题; 并提供了交互检验(Cross Validation)的功能. 该软件包可在.tw/~cjlin/ 免费获得. 该软件可以解决C-SVM, ν-SVM, ε-SVR和ν-SVR等问题, 包括基于一对一算法的多类模式识别问题.这套库可以从.tw/~cjlin/libsvm/index.html免费获得, 目前已经发展到3.12版(2012.4.1更新).下载.tar.gz格式的版本, Windows下也可以直接解压, 主要有6个文件夹和一些源码文件.Java: 主要是应用于java平台;matlab: windows下64位matlab平台;python: 是用来参数优选的工具, 稍后介绍;svm-toy: 一个可视化的工具, 用来展示训练数据和分类界面, 里面是源码, 其编译后的程序在windows文件夹下;tools: 主要包含四个python文件, 用来数据集抽样(subset), 参数优选(grid), 集成测试(easy), 数据检查(checkdata);windows: 包含libSVM四个exe程序包, 我们所用的库就是他们.文件夹里面还有个heart_scale, 是一个样本文件, 可以用记事本打开, 用来测试用的.其他.h和.cpp文件都是程序的源码, 可以编译出相应的.exe文件. 其中, 最重要的是svm.h和svm.cpp文件, svm-predict.c, svm-scale.c和svm-train.c(还有一个svm-toy.c 在svm-toy文件夹中)都是调用的这个文件中的接口函数, 编译后就是windows下相应的四个exe程序. 另外, 里面的README跟FAQ也是很好的文件, 对于初学者如果W文较好的话, 可以看一下.对于仅仅使用libsvm库的人来说, windows下的4个exe包已经足够了, 如果是为了做深入研究, 可以按照自己的思路文件夹中的.cpp和.c文件, 然后编译验证)2: 下面开始测试libsvm工具包1). 把LibSVM包解压到相应的目录(因为我只需要里面windows文件夹中的exe程序包, 我们也可以只把windows文件夹拷到相应的目录), 比如C:\jacoxu\test\libsvm-3.122). 在电脑”开始”的”运行”中输入cmd, 进入DOS环境. 定位到C:\jacoxu\test\libsvm-3.12下, 具体命令如下:3). 进行libsvm训练, 输入命令:svm-train ../heart_scale train.modelheart_scale: 是目录下的已经存在的样本文件, 要换成自己的文件, 只需改成自己的文件名就可以了;train.model: 是创建的结果文件, 保存了训练后的结果:其中, #iter 为迭代次数;nu 是选择的核函数类型的参数;obj 为SVM文件转换为的二次规划求解得到的最小值;rho 为判决函数的偏置项b;nSV 为标准支持向量个数(0<a[i]<c);nBSV 为边界上的支持向量个数(a[i]=c);Total nSV为支持向量总个数(对于两类来说, 因为只有一个分类模型Total nSV = nSV但是对于多类, 这个是各个分类模型的nSV之和).在目录下, 还可以看到产生了一个train.model文件, 可以用记事本打开, 记录了训练后的结果.4.nr_class 2 //类别数, 此处为两分类问题5.total_sv 132 //支持向量总个数6.rho 0.424462 //判决函数的偏置项bbel 1 -1 //原始文件中的类别标识8.nr_sv 64 68 //每个类的支持向量机的个数9.SV //以下为各个类的权系数及相应的支持向量10. 1 1:0.166667 2:1 3:-0.333333 … 10:-0.903226 11:-1 12:-1 13:111.0.5104832128985164 1:0.125 2:1 3:0.333333 … 10:-0.806452 12:-0.333333 13:0.512.………13.-1 1:-0.375 2:1 3:-0.333333…. 10:-1 11:-1 12:-1 13:114.-1 1:0.166667 2:1 3:1 …. 10:-0.870968 12:-1 13:0.5这里注意, 第二行出现的权系数为小数(0.5104832128985164)是因为这个点属于非边界上的支持向量, 即: (0<a[i]<c).其他的两个(svm-predict, svm-scale)的使用过程类似.3: libsvm使用规范1). libSVM的数据格式Label 1: value 2:value ….Label: 是类别的标识, 比如上节train.model中提到的1 -1, 你可以自己随意定, 比如-10, 0, 15. 当然, 如果是回归, 这是目标值, 就要实事求是了.Value: 就是要训练的数据, 从分类的角度来说就是特征值, 数据之间用空格隔开.比如: -15 1:0.708 2:1056 3:-0.3333需要注意的是, 如果特征值为0, 特征冒号前面的(姑且称做序号)可以不连续. 如: -15 1:0.708 3:-0.3333表明第2个特征值为0, 从编程的角度来说, 这样做可以减少内存的使用, 并提高做矩阵内积时的运算速度. 我们平时在matlab中产生的数据都是没有序号的常规矩阵, 所以为了方便最好编一个程序进行转化.2). svmscale的用法svmscale是用来对原始样本进行缩放的, 范围可以自己定, 一般是[0,1]或[-1,1]. 缩放的目的主要是1) 防止某个特征过大或过小, 从而在训练中起的作用不平衡;2) 为了计算速度. 因为在核计算中, 会用到内积运算或exp运算, 不平衡的数据可能造成计算困难.用法: svmscale [-l lower] [-u upper][-y y_lower y_upper][-s save_filename][-r restore_filename] filename其中, []中都是可选项:-l: 设定数据下限; lower: 设定的数据下限值, 缺省为-1-u: 设定数据上限; upper: 设定的数据上限值, 缺省为1-y: 是否对目标值同时进行缩放; y_lower为下限值, y_upper为上限值;-s save_filename: 表示将缩放的规则保存为文件save_filename;-r restore_filename: 表示将按照已经存在的规则文件restore_filename进行缩放;filename: 待缩放的数据文件, 文件格式按照libsvm格式.默认情况下, 只需要输入要缩放的文件名就可以了: 比如(已经存在的文件为test.txt) svmscale test.txt这时, test.txt中的数据已经变成[-1,1]之间的数据了. 但是, 这样原来的数据就被覆盖了, 为了让规划好的数据另存为其他的文件, 我们用一dos的重定向符>来另存为(假设为out.txt):svmscale test.txt > out.txt运行后, 我们就可以看到目录下多了一个out.txt文件, 那就是规范后的数据. 假如, 我们想设定数据范围[0,1], 并把规则保存为test.range文件:svmscale –l 0 –u 1 –s test.range test.txt > out.txt这时, 目录下又多了一个test.range文件, 可以用记事本打开, 下次就可以用-r test.range来载入了.3). svmtrain的用法svmtrain我们在前面已经接触过, 他主要实现对训练数据集的训练, 并可以获得SVM模型.用法: svmtrain [options] training_set_file [model_file]其中, options为操作参数, 可用的选项即表示的涵义如下所示:-s 设置svm类型:0 – C-SVC1 – v-SVC2 – one-class-SVM3 –ε-SVR4 – n – SVR-t 设置核函数类型, 默认值为20 —线性核: μ‘∗νμ‘∗ν1 —多项式核: (γ∗μ‘∗ν+coef0)degree(γ∗μ‘∗ν+coef0)degree2 — RBF核: exp(–γ∗∥μ−ν∥2)exp⁡(–γ∗∥μ−ν∥2)3 — sigmoid 核: tanh(γ∗μ‘∗ν+coef0)tanh⁡(γ∗μ‘∗ν+coef0)-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);-wi weight: 设置第几类的参数C为weight*C (C-SVC中的C) (默认1);-v n: n-fold交互检验模式, n为fold的个数, 必须大于等于2;-b 概率估计: 是否计算SVC或SVR的概率估计, 可选值0或1, 默认0;model_file: 可选项, 为要保存的结果文件, 称为模型文件, 以便在预测时使用.其中-g选项中的k是指输入数据中的属性数. option -v 随机地将数据剖分为n部分并计算交互检验准确度和均方根误差. 以上这些参数设置可以按照SVM的类型和核函数所支持的参数进行任意组合, 如果设置的参数在函数或SVM类型中没有也不会产生影响, 程序不会接受该参数; 如果应有的参数设置不正确, 参数将采用默认值.training_set_file是要进行训练的数据集; model_file是训练结束后产生的模型文件, 文件中包括支持向量样本数, 支持向量样本以及lagrange系数等必须的参数; 该参数如果不设置将采用默认的文件名, 也可以设置成自己惯用的文件名.默认情况下, 只需要给函数提供一个样本文件名就可以了, 但为了能保存结果, 还是要提供一个结果文件名, 比如: test.model, 则命令为:svmtrain test.txt test.model4). svmpredict 的用法svmpredict 是根据训练获得的模型, 对数据集合进行预测.用法: svmpredict [options] test_file model_file output_file其中, options为操作参数, 可用的选项即表示的涵义如下所示:-b probability_estimates: 是否需要进行概率估计预测, 可选值为0 或者1, 默认值为0.model_file: 是由svmtrain 产生的模型文件;test_file: 是要进行预测的数据文件, 格式也要符合libsvm格式, 即使不知道label的值, 也要任意填一个, svmpredict会在output_file中给出正确的label结果, 如果知道label的值, 就会输出正确率;output_file: 是svmpredict 的输出文件, 表示预测的结果值。

libsvm使用说明

libsvm使用说明

libSVM的使用文档11. 程序介绍和环境设置windows下的libsvm是在命令行运行的Console Program。

所以其运行都是在windows的命令行提示符窗口运行(运行,输入cmd)。

运行主要用到的程序,由如下内容组成:libsvm-2.9/windows/文件夹中的:svm-train.exesvm-predict.exesvm-scale.exelibsvm-2.9/windows/文件夹中的:checkdata.pysubset.pyeasy.pygrid.py另外有:svm-toy.exe,我暂时知道的是用于演示svm分类。

其中的load按钮的功能,是否能直接载入数据并进行分类还不清楚,尝试没有成功;python文件夹及其中的svmc.pyd,暂时不清楚功能。

因为程序运行要用到python脚本用来寻找参数,使用gnuplot来绘制图形。

所以,需要安装python和Gnuplot。

(Python v3.1 Final可从此下载:/detail/33/320958.shtml)(gnuplot可从其官网下载:)为了方便,将gnuplot的bin、libsvm-2.9/windows/加入到系统的path中,如下:gnuplot.JPGlibsvm.JPG这样,可以方便的从命令行的任何位置调用gnuplot和libsvm的可执行程序,如下调用svm-train.exe:pathtest.JPG出现svm-train程序中的帮助提示,说明path配置成功。

至此,libsvm运行的环境配置完成。

下面将通过实例讲解如何使用libsvm进行分类。

2. 使用libsvm进行分类预测我们所使用的数据为UCI的iris数据集,将其类别标识换为1、2、3。

然后,取3/5作为训练样本,2/5作为测试样本。

使用论坛中“将UCI数据转变为LIBSVM使用数据格式的程序”一文将其转换为libsvm所用格式,如下:训练文件tra_iris.txt1 1:5.4 2:3.4 3:1.7 4:0.21 1:5.1 2:3.7 3:1.5 4:0.41 1:4.6 2:3.6 3:1 4:0.21 1:5.1 2:3.3 3:1.7 4:0.51 1:4.8 2:3.4 3:1.9 4:0.2……2 1:5.9 2:3.2 3:4.8 4:1.82 1:6.1 2:2.8 3:4 4:1.32 1:6.3 2:2.5 3:4.9 4:1.52 1:6.1 2:2.8 3:4.7 4:1.22 1:6.4 2:2.9 3:4.3 4:1.3……3 1:6.9 2:3.2 3:5.7 4:2.33 1:5.6 2:2.8 3:4.9 4:23 1:7.7 2:2.8 3:6.7 4:23 1:6.3 2:2.7 3:4.9 4:1.83 1:6.7 2:3.3 3:5.7 4:2.13 1:7.2 2:3.2 3:6 4:1.8……测试文件tes_iris.txt1 1:5.1 2:3.5 3:1.4 4:0.21 1:4.9 2:3 3:1.4 4:0.21 1:4.7 2:3.2 3:1.3 4:0.21 1:4.6 2:3.1 3:1.5 4:0.21 1:5 2:3.6 3:1.4 4:0.21 1:5.4 2:3.9 3:1.7 4:0.4……2 1:7 2:3.2 3:4.7 4:1.42 1:6.4 2:3.2 3:4.5 4:1.52 1:6.9 2:3.1 3:4.9 4:1.52 1:5.5 2:2.3 3:4 4:1.32 1:6.5 2:2.8 3:4.6 4:1.5……3 1:6.3 2:3.3 3:6 4:2.53 1:5.8 2:2.7 3:5.1 4:1.93 1:7.1 2:3 3:5.9 4:2.13 1:6.3 2:2.9 3:5.6 4:1.83 1:6.5 2:3 3:5.8 4:2.2……libsvm的参数选择一直是令人头痛的问题。

libsvm简易说明

libsvm简易说明

LOGO教你认识SVM 和使用开源工具LibSVM夏睿rxia@v SVM能解决什么问题?§从机器学习谈起§分类与回归v为什么选择SVM?§从ANN到SVM§SVM的两个核心思想§SVM算法v怎么用SVM?§用LibSVM做分类§用LibSVM做回归§Python平台下的LibSVM 提纲从机器学习谈起v目的根据给定的训练样本,对某系统输入输出之间依赖关系的估计,使它能够对未知输出作出尽可能准确的预测。

v机器学习的三个基本问题§模式识别——分类§函数拟合——回归§概率密度估计v数学表述§给定条件:n个独立同分布观测样本§目标:求一个最优函数§最理想的要求:最小化期望风险v机器学习方法的代表§人工神经网络(ANN)& 支持向量机(SVM)1122(,),(,),(,)n nx y x y x yL*(,)f x w()(,(,))(,)R w L y f x w dF x y=∫全局最优解容易陷入局部最小训练较快训练较慢这个黑匣子要透明一点,怎么个透明法?(过人之处2)完全的黑匣子,高度非线性,人工难以理解和干预推广能力的控制(过人之处1)过学习结构风险最小化(SRM)经验风险最小化(ERM)统计学习理论传统统计学SVM使分类间隔最大实际上就是对推广能力的控制这是一个不等式约束下的二次函数寻优问题:优化方法将原问题转化为其对偶问题。

非线性的解决v解决非线性问题通过合理的非线性变化,将非线性问题转化为某个高维空间的线性问题。

vSVM怎么实现低维到高维的变换§从广义最优分类面能得到什么启示?§关键问题:怎么计算需要知道变换的具体形式吗?灾难维数?NO!****1(),()()sgn{}sgn{(()())}ni i iih x g x f h w h b y x x bφαφφ====⋅+=⋅+∑()()ix xφφ⋅(x ϕ=⋅v为什么选择LibSVM(.tw/~cjlin/libsvm)§Different SVM formulations§Efficient multi-class classification§Cross validation for model selection§Probability estimates§Weighted SVM for unbalanced data§Both C++ and Java sources§GUI demonstrating SVM classification and regression§Python, R(also Splus), MATLAB, Perl, Ruby, Weka, Common LISP and LabVIEW interfaces. C# .NET code is available.§Automatic model selection which can generate contour of cross valiation accuracy. v使用LibSVM的一些准备工作§平台•Win32+python+pnuplot•Linux+python+pnuplot§数据•Training Set•Test Set§SVM基础知识SVM开源工具——LibSVMv文本编码ASCII/ANSIv数据存储格式§每行格式:label feature1:value1 index2:value2 ...•label为类别标号,feature为特征序号,value为特征的值•value为0时该项可以省略(大规模数据时节省存储空间)§示例:iris.tr(UCI / Iris Plant, 4 features, 3 classes)v格式检验脚本checkdata.pypython checkdata.py iris.tr.txt1 1:-0.555556 2:0.5 3:-0.694915 4:-0.753 1:-0.166667 2:-0.333333 3:0.38983 4:0.9166672 1:-0.333333 2:-0.75 3:0.0169491 4:-4.03573e-081 1:-0.833333 3:-0.864407 4:-0.9166671 1:-0.611111 2:0.0833333 3:-0.864407 4:-0.9166673 1:0.611111 2:0.333333 3:0.728813 4:13 1:0.222222 3:0.38983 4:0.5833332 1:0.222222 2:-0.333333 3:0.220339 4:0.1666672 1:-0.222222 2:-0.333333 3:0.186441 4:-4.03573e-08…样本文件格式LibSVM数据标准化v svm-scale命令(使用的是极值标准化)§格式:svm-scale [options] filenameoptions:•上下界(默认[-1,1]):-l lower -u upper•存储标准化尺度:-s scalefile•加载标准化尺度:-r scalefile•标签的标准化(用于回归):-y lower upper§使用提醒•训练集和测试集一起scale,将所有数据缩放到[lower, upper]•新来的测试样本,应该使用训练时候的标准化尺度进行标准化§示例svm-scale-s iris.scale iris.trainsvm-scale-l -0.8 -u 0.8 -s iris.scale iris.train> iris.train.scaledsvm-scale-r iris.scale iris.testv示例§最简单的训练,所有参数均默认§任务类型默认(C-SVC)、核函数默认(RBF),10-fold, c=100, g=0.01, 保存训练模型§任务类型默认(C-SVC),选用线性核函数,10-fold, c=100§采用概率模型,其余同上v一个重要问题,怎么选择参数?§自动:libSVM提供的寻优脚本§手动:用试的!!svm-train-v 10 iris.train iris.modelsvm-train-t 0 –v 10 –c 100 –g 0.01 iris.train iris.modelsvm-train iris.trainsvm-train–b 1 -t 0 –v 10 –c 100 –g 0.01 iris.train iris.modelLibSVM训练参数寻优v参数自动寻优的训练脚本grid.py(Cross-validation and Grid-search)§适用任务:分类问题& RBF核(或linear核)§格式:python [options] grid.py trainingfilename§options•-svmtrain pathname•-gnuplot pathname•-out pathname•-png pathname•-log2c begin,end,step•-log2g begin,end,step•additional same options for svm-train§示例§linear核怎么使用?——设置一个虚拟的gamma参数: -log2g 1,1,1 python grid.py iris.trainpython grid.py–svmtrain d:\libsvm\svm-train.exe–gnuplot d:\gnuplot\bin\pgnuplot.exe-png d:\iris.gird.png–log2c -8,8,2 –log2g 8,-8,-2 –v 10 iris.trainpython grid.py–log2c -8,8,2 –log2g 1,1,1 –t 0 –v 10 iris.train寻优结果v 参数寻优图示LibSVM测试v格式:svm-predict [options] testfile modelfile resultfile options§-b probability : -b 0只输出类别;-b 1输出各类概率v返回结果§各测试样本的类别(-b 1时为各类后验概率)§正确率v 示例v 值得注意的§部分任务不支持概率输出(比如SVR, one-class SVM)§-b参数需要svm-train的时候建立概率模型与之对应§新来的样本按照训练集标准化的尺度进行标准化svm-train–b 1 iris.train iris.modelsvm-predict iris.test iris.model iris.resultsvm-predict –b 1iris.test iris.model iris.resultsvm-scale-r iris.train.scale iris.test> iris.test.scaled怎么用LibSVM做回归?v数据标准化§对label 同时进行标准化(量纲较小的时候可以忽略该步)v参数寻优§脚本:grid.pyàgridregression.py§寻优的参数:-c -g à-c -g –pv训练建模§任务的选择:-s 3 (epsilon -SVR)§核函数的选择:通常选择-t 2 (RBF核,默认)或-t 0(linear核)§与分类任务相比,多了一个基本参数p,建模时就用寻优找到的参数v测试§评估指标:Rate àMSE§返回值需要经过反标准化,恢复原来的量纲:好像要你自己做了!svm-scale-y -1 1 regression.train.scaled regression.modelsvm-train–s 3 -c 100 –g 0.01 –p 0.1regression.train.scaled regression.modelpython gridregression.py–log2c -8,8,2 –log2g 8,-8,-2 –log2p -8,8,2 –v 10 regression.trainsvm-predict regression.test regression.model regression.resultv安装§将已经编译好的svmc.pyd文件(位于libsvm\windows\python\目录下)拷贝到系统环境变量目录(如python根目录)§将svm.py文件拷贝到当前文件夹§将cross_validation.py拷贝到当前文件夹v使用§导入模块§设置训练参数(包含svm_type, kernel_type, gamma, C…)§加载数据from svm import *param= svm_parameter(svm_type= C_SVC, kernel_type= LINEAR)param.kernel_type= RBFListLable= [1, -1]ListValue= [[1, 0, 1], [-1, 0 ,-1]]# ListValue= [{1:1, 3:1}, {1:-1, 3:-1}]prob= svm_problem(ListLabel, ListValue)§建模§模型保存与加载§测试mod = svm_model(prob, param)r = mod.predict([1, 1, 1])d = mod.predict_values([1, 1, 1])prd, prb= m.predict_probability([1, 1, 1]) mod.save(‘modelfile’)mod2 = svm_model(‘modelfile’)target = cross_validation(prob, param, n) LOGOQ? / AThank you!。

LIBSVM使用介绍

附录1:LIBSVM的简单介绍1. LIBSVM软件包简介LIBSVM是台湾大学林智仁(Chih-Jen Lin)博士等开发设计的一个操作简单、易于使用、快速有效的通用SVM软件包,可以解决分类问题(包括C SVC−、SVCν−)、回归问题(包括SVRε−、SVRν−)以及分布估计(on e class SVM−−)等问题,提供了线性、多项式、径向基和S形函数四种常用的核函数供选择,可以有效地解决多类问题、交叉验证选择参数、对不平衡样本加权、多类问题的概率估计等。

LIBSVM是一个开源的软件包,需要者都可以免费的从作者的个人主页.tw/~cjlin/处获得。

他不仅提供了LIBSVM的C++语言的算法源代码,还提供了Python、Java、R、MA TLAB、Perl、Ruby、LabVIEW 以及C#.net等各种语言的接口,可以方便的在Windows或UNIX平台下使用,也便于科研工作者根据自己的需要进行改进(譬如设计使用符合自己特定问题需要的核函数等)。

另外还提供了WINDOWS平台下的可视化操作工具SVM-toy,并且在进行模型参数选择时可以绘制出交叉验证精度的等高线图。

2. LIBSVM使用方法简介LIBSVM在给出源代码的同时还提供了Windows操作系统下的可执行文件,包括:进行支持向量机训练的svmtrain.exe;根据已获得的支持向量机模型对数据集进行预测的svmpredict.exe;以及对训练数据与测试数据进行简单缩放操作的svmscale.exe。

它们都可以直接在DOS环境中使用。

如果下载的包中只有C++的源代码,则也可以自己在VC等软件上编译生成可执行文件。

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

人工智能学习笔记实验五python实现SVM分类器的设计与应用

⼈⼯智能学习笔记实验五python实现SVM分类器的设计与应⽤学习来源实验原理有关svm原理 请移步该篇通俗易懂的博客下图 或许可以简单概括svm功能与原理有关深究svm原理 请移步该篇通俗易懂的博客或者评论我获取svm学习ppt实验内容1. 数据库的选择可选取 ORL ⼈脸数据库作为实验样本,总共 40 个⼈,每⼈ 10 幅图像,图像⼤⼩为112*92 像素。

图像本⾝已经经过处理,不需要进⾏归⼀化和校准等⼯作。

实验样本分为训练样本和测试样本。

⾸先设置训练样本集,选择 40 个⼈前 5 张图⽚作为训练样本,进⾏训练。

然后设置测试样本集,将 40 个⼈后 5 张图⽚作为测试样本,进⾏选取识别。

2. 实验基本步骤⼈脸识别算法步骤概述:a) 读取训练数据集;若 flag=0,表述读取原⽂件的前五幅图作为训练数据,若 flag=1,表述读取原⽂件的后五幅图作为测试数据,数据存⼊ f_matrix 中,每⼀⾏为⼀个⽂件,每⾏为 112*92列。

参见:ReadFace.mb) 主成分分析法降维并去除数据之间的相关性;参见:fastPCA.mc) 数据规格化;参见 scaling.md) SVM 训练(选取径向基和函数)得到分类函数;参见:multiSVMtrain.me) 读取测试数据、降维、规格化;参见:multiSVM.mf) ⽤步骤 d 产⽣的分类函数进⾏分类(多分类问题,采⽤⼀对⼀投票策略,归位得票最多的⼀类);参见:main.mg) 计算正确率。

以上只是matlib做法⽽我会使⽤python做法3. 实验要求1) 分别使⽤ PCA 降维到 20,50,100,200,然后训练分类器,对⽐分类结果,画出对⽐曲线;2) 变换 SVM 的 kernel 函数,如分别使⽤径向基函数和多项式核函数训练分类器,对⽐分类结果,画出对⽐曲线;3) 使⽤交叉验证⽅法,变换训练集及测试集,分析分类结果。

实验步骤⼀、分别使⽤ PCA 降维到 20,50,100,200,然后训练分类器,对⽐分类结果,画出对⽐曲线;1.数据处理def get_data(x,y):file_path='./ORL/' #设置⽂件路径(这⾥为当前⽬录下的ORL⽂件夹)train_set = np.zeros(shape=[1,112*92]) #train_set⽤于获取的数据集train_set = pd.DataFrame(train_set) #将train_set转换成DataFrame类型target=[] #标签列表for i in range(1,41): #i⽤于遍历ORL⽂件夹中的40个⽂件夹for j in range(x,y): #j⽤于遍历每个⽂件夹的对应的x到y-1的图⽚target.append(i) #读⼊标签(图⽚⽂件夹中的⼈脸是同⼀个⼈的)img = cv2.imread(file_path+'s'+str(i)+'/'+str(j)+'.bmp',\cv2.IMREAD_GRAYSCALE) #读取图⽚,第⼆个参数表⽰以灰度图像读⼊img=img.reshape(1,img.shape[0]*img.shape[1]) #将读⼊的图⽚数据转换成⼀维img=pd.DataFrame(img) #将⼀维的图⽚数据转成DataFrame类型train_set=pd.concat([train_set,img],axis=0)#按⾏拼接DataFrame矩阵train_set.index=list(range(0,train_set.shape[0])) #设置 train_set的⾏索引train_set.drop(labels=0,axis=0,inplace=True) #删除⾏索引为0的⾏(删除第⼀⾏)target=pd.DataFrame(target) #将标签列表转成DataFrame类型return train_set,target #返回数据集和标签2.数据标准化+PCA降维+⾃动def face_fuc1(face_data_train,face_target_train,face_data_test,face_target_test):#2、数据标准化标准差标准化stdScaler = StandardScaler().fit(face_data_train)face_trainStd = stdScaler.transform(face_data_train)face_testStd = stdScaler.transform(face_data_test)#dimension=[3,5,10,20,50,100,200]dimension=[20,50,100,200]'''dimension=[]for i in range(1,40):dimension.append(i*5)'''accuracy=[]for i in dimension:#3、PCA降维pca = PCA(n_components=i).fit(face_trainStd)face_trainPca = pca.transform(face_trainStd)face_testPca = pca.transform(face_testStd)#4、建⽴SVM模型默认为径向基核函数kernel='rbf' 多项式核函数kernel='poly'#svm = SVC().fit(face_trainPca,face_target_train)svm = SVC(kernel='poly').fit(face_trainPca,face_target_train)#5、预测训练集结果face_target_pred = svm.predict(face_testPca)#6、分析预测结果true=0for i in range(0,200):if face_target_pred[i] == face_target_test[i]:true+=1accuracy.append(true/face_target_test.shape[0])print(accuracy)plt.plot(dimension,accuracy,"b-")plt.legend(['默认径向基核函数kernel=\'rbf\'','多项式核函数kernel=\'poly\''])plt.show()#draw_chart1(dimension,accuracy)3.总代码import cv2 #opencv库,⽤于读取图⽚等操作import numpy as npimport pandas as pdfrom sklearn.preprocessing import StandardScaler #标准差标准化from sklearn.svm import SVC #svm包中SVC⽤于分类from sklearn.decomposition import PCA #特征分解模块的PCA⽤于降维import matplotlib.pyplot as plt #⽤于绘制图形def get_data(x,y):file_path='./ORL/' #设置⽂件路径(这⾥为当前⽬录下的ORL⽂件夹)train_set = np.zeros(shape=[1,112*92]) #train_set⽤于获取的数据集train_set = pd.DataFrame(train_set) #将train_set转换成DataFrame类型target=[] #标签列表for i in range(1,41): #i⽤于遍历ORL⽂件夹中的40个⽂件夹for j in range(x,y): #j⽤于遍历每个⽂件夹的对应的x到y-1的图⽚target.append(i) #读⼊标签(图⽚⽂件夹中的⼈脸是同⼀个⼈的)img = cv2.imread(file_path+'s'+str(i)+'/'+str(j)+'.bmp',\cv2.IMREAD_GRAYSCALE) #读取图⽚,第⼆个参数表⽰以灰度图像读⼊img=img.reshape(1,img.shape[0]*img.shape[1]) #将读⼊的图⽚数据转换成⼀维 img=pd.DataFrame(img) #将⼀维的图⽚数据转成DataFrame类型train_set=pd.concat([train_set,img],axis=0)#按⾏拼接DataFrame矩阵train_set.index=list(range(0,train_set.shape[0])) #设置 train_set的⾏索引train_set.drop(labels=0,axis=0,inplace=True) #删除⾏索引为0的⾏(删除第⼀⾏) target=pd.DataFrame(target) #将标签列表转成DataFrame类型return train_set,target #返回数据集和标签return train_set,target #返回数据集和标签def draw_chart(dimension,accuracy):plt.rcParams['font.sans-serif']='SimHei'plt.figure(figsize=(6,6))plt.plot(dimension,accuracy,"r-")plt.xlabel('PCA降维的维度')plt.ylabel('⼈脸识别准确率')plt.title('linear不同维度差异')#plt.savefig("./tmp/采⽤默认径向基核函数kernel=\'rbf\' 先降维后标准化.png")plt.show()def draw_chart1(dimension,accuracy):plt.rcParams['font.sans-serif']='SimHei'plt.figure(figsize=(6,6))plt.plot(dimension,accuracy,"r-")plt.xlabel('PCA降维的维度')plt.ylabel('⼈脸识别准确率')plt.title('poly不同维度差异')#plt.savefig("./tmp/采⽤默认径向基核函数kernel=\'rbf\' 先降维后标准化.png")plt.show()def face_fuc(face_data_train,face_target_train,face_data_test,face_target_test): #2、数据标准化标准差标准化stdScaler = StandardScaler().fit(face_data_train)face_trainStd = stdScaler.transform(face_data_train)face_testStd = stdScaler.transform(face_data_test)#dimension=[3,5,10,20,50,100,200]dimension=[20,50,100,200]'''dimension=[]for i in range(1,40):dimension.append(i*5)'''accuracy=[]for i in dimension:#3、PCA降维pca = PCA(n_components=i).fit(face_trainStd)face_trainPca = pca.transform(face_trainStd)face_testPca = pca.transform(face_testStd)#4、建⽴SVM模型默认为径向基核函数kernel='rbf' 多项式核函数kernel='poly' svm = SVC(kernel='linear').fit(face_trainPca,face_target_train)#svm = SVC(kernel='poly').fit(face_trainPca,face_target_train)#5、预测训练集结果face_target_pred = svm.predict(face_testPca)#6、分析预测结果true=0for i in range(0,200):if face_target_pred[i] == face_target_test[i]:true+=1accuracy.append(true/face_target_test.shape[0])print(accuracy)draw_chart(dimension,accuracy)def face_fuc1(face_data_train,face_target_train,face_data_test,face_target_test): #2、数据标准化标准差标准化stdScaler = StandardScaler().fit(face_data_train)face_trainStd = stdScaler.transform(face_data_train)face_testStd = stdScaler.transform(face_data_test)#dimension=[3,5,10,20,50,100,200]dimension=[20,50,100,200]'''dimension=[]for i in range(1,40):dimension.append(i*5)'''accuracy=[]for i in dimension:#3、PCA降维pca = PCA(n_components=i).fit(face_trainStd)face_trainPca = pca.transform(face_trainStd)face_testPca = pca.transform(face_testStd)#4、建⽴SVM模型默认为径向基核函数kernel='rbf' 多项式核函数kernel='poly' #svm = SVC().fit(face_trainPca,face_target_train)svm = SVC(kernel='poly').fit(face_trainPca,face_target_train)#5、预测训练集结果face_target_pred = svm.predict(face_testPca)#6、分析预测结果true=0for i in range(0,200):if face_target_pred[i] == face_target_test[i]:true+=1accuracy.append(true/face_target_test.shape[0])print(accuracy)plt.plot(dimension,accuracy,"b-")plt.legend(['默认径向基核函数kernel=\'rbf\'','多项式核函数kernel=\'poly\''])plt.show()#draw_chart1(dimension,accuracy)if __name__ == '__main__':#1、获取数据face_data_train,face_target_train=get_data(1,6) #读取前五张图⽚为训练集face_data_test,face_target_test=get_data(6,11) #读取后五张图⽚为测试集face_target_test=face_target_test.values #将DataFrame类型转成ndarrayl类型 # face_fuc(face_data_train,face_target_train,face_data_test,face_target_test) face_fuc1(face_data_train,face_target_train,face_data_test,face_target_test)4.处理结果⼆、变换 SVM 的 kernel 函数,如分别使⽤径向基函数和多项式核函数训练分类器,对⽐分类结果,画出对⽐曲线。

我的OpenCV学习笔记(六):使用支持向量机(SVM)

我的OpenCV学习笔记(六):使用支持向量机(SVM)SVM是2000年左右提出的一种新的分类方法,着重解决了小样本分类问题。

具体原理可以参看模式识别的书籍。

OpenCV中的SVM的实现也是基于大名鼎鼎的SVM库:.tw/~cjlin。

OpenCV教程中有两个例子,一个是线性可分的,一个是线性不可分的,我对他们做了详尽的注释:先看线性可分时:[cpp] view plaincopy#include&lt;opencv2/core/core.hpp&gt; #include&lt;opencv2/highgui/highgui.hpp&gt; #include&lt;opencv2/ml/ml.hpp&gt; using namespace cv;int main() { // Data for visual representationint width = 512, height = 512; Mat image =Mat::zeros(height, width, CV_8UC3); // Set up training data float labels[5] = {1.0, -1.0, -1.0, -1.0,1.0}; Mat labelsMat(5, 1, CV_32FC1, labels); float trainingData[5][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501},{501,128} }; Mat trainingDataMat(5, 2,CV_32FC1, trainingData); //设置支持向量机的参数CvSVMParams params; params.svm_type= CvSVM::C_SVC;//SVM类型:使用C支持向量机params.kernel_type = CvSVM::LINEAR;//核函数类型:线性params.term_crit =cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);//终止准则函数:当迭代次数达到最大值时终止//训练SVM //建立一个SVM类的实例CvSVM SVM; //训练模型,参数为:输入数据、响应、XX、XX、参数(前面设置过)SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params); Vec3b green(0,255,0), blue (255,0,0); //显示判决域for (int i = 0; i &lt; image.rows; ++i) for (int j = 0; j &lt; image.cols; ++j) { Mat sampleMat = (Mat_&lt;float&gt;(1,2) &lt;&lt; i,j);//predict是用来预测的,参数为:样本、返回值类型(如果值为ture而且是一个2类问题则返回判决函数值,否则返回类标签)、float response =SVM.predict(sampleMat); if (response == 1) image.at&lt;Vec3b&gt;(j, i) = green; else if (response == -1)image.at&lt;Vec3b&gt;(j, i) = blue; } //画出训练数据int thickness = -1; int lineType = 8; circle( image, Point(501, 10), 5, Scalar( 0, 0,0), thickness, lineType);//画圆circle( image,Point(255, 10), 5, Scalar(255, 255, 255), thickness, lineType); circle( image, Point(501, 255), 5,Scalar(255, 255, 255), thickness, lineType);circle( image, Point( 10, 501), 5, Scalar(255, 255, 255), thickness, lineType); circle(image, Point( 501, 128), 5, Scalar(0, 0, 0), thickness, lineType); //显示支持向量thickness = 2; lineType = 8; //获取支持向量的个数int c =SVM.get_support_vector_count(); for (int i = 0; i &lt; c; ++i) { //获取第i个支持向量const float* v = SVM.get_support_vector(i); //支持向量用到的样本点,用灰色进行标注circle( image, Point( (int) v[0], (int) v[1]), 6,Scalar(128, 128, 128), thickness, lineType); } imwrite("result.png", image); // save the image imshow("SVM Simple Example", image); // show it to the user waitKey(0); }线性不可分时由于样本较多,训练的时间比较长:[cpp] view plaincopy#include &lt;iostream&gt; #include&lt;opencv2/core/core.hpp&gt; #include&lt;opencv2/highgui/highgui.hpp&gt; #include&lt;opencv2/ml/ml.hpp&gt; #include "time.h" using namespace cv; using namespace std; //程序说明://一共两个样本集每个样本集有100个样本,其中90个是线性可分的,10个线型不可分//这200个样本数据储存在trainData内:trainData是一个200行2列的矩阵,其中第一列储存样本的X值,第二列储存的是样本的Y值//每一列的前90个元素是第一类的线性可分部分,后90个元素是第二类的线性可分部分,中间的20个元素是线性不可分部分//第一类样本的X值分布在整幅图像的[0,0.4]范围内,第二类样本的X值分布在整幅图像的[0.6,1]范围内,中间的[0.4,0.6]是线性不可分的部分;这三部分的Y值都在整幅图像的高度内自由分布//每个样本集的数量#define NTRAINING_SAMPLES 100 //其中的线性部分#define FRAC_LINEAR_SEP 0.9f int main(){ //定义显示结果的图像//图像的宽度、高度const int WIDTH = 512,HEIGHT = 512; Mat image = Mat::zeros(HEIGHT,WIDTH,CV_8UC3);//************第一步:设定训练数据***********//************1.设定数据结构**************** //承载训练数据的结构MattrainData(2*NTRAINING_SAMPLES,2,CV_32FC1);//承载这些数据分类的结构Matlabels(2*NTRAINING_SAMPLES,1,CV_32FC1); //设定随机数种子RNG rng(100); //设定线性可分部分的数据量int nLinearSamples = (int) (NTRAINING_SAMPLES*FRAC_LINEAR_SEP);//**************2.设定第一类中的数据********* //从整个数据集中取出前[0,89]行//注:*Range的范围是[a,b) Mat trainClass = trainData.rowRange(0,nLinearSamples); //取出第一列Mat c = trainClass.colRange(0,1);//随机生成X的值:[0,0.4*WIDTH]rng.fill(c,RNG::UNIFORM,Scalar(1),Scalar(0.4*WIDTH)); //取出第二列 c = trainClass.colRange(1,2); //随机生成Y的值rng.fill(c,RNG::UNIFORM,Scalar(1),Scalar(HEIGHT));//**************2.设定第二类的数据************* //从整个数据中取出[110,199]行trainClass =trainData.rowRange(2*NTRAINING_SAMPLES-nLinearSa mples,2*NTRAINING_SAMPLES); //取出第一列c = trainClass.colRange(0,1); //随机生成X的值[0.6*WIDTH,WIDTH]rng.fill(c,RNG::UNIFORM,Scalar(0.6*WIDTH),Scalar(WID TH)); //取出第二列 c =trainClass.colRange(1,2); //随机生成Y的值rng.fill(c,RNG::UNIFORM,Scalar(1),Scalar(HEIGHT));//***************3.设定线性不可分的数据*********** //取出[90,109]行trainClass =trainData.rowRange(nLinearSamples,2*NTRAINING_SAM PLES-nLinearSamples); //取出第一列 c = trainClass.colRange(0,1); //随机生成X的值[0.4*WIDTH,0.6*WIDTH]rng.fill(c,RNG::UNIFORM,Scalar(0.4*WIDTH),Scalar(0.6* WIDTH)); //取出第二列 c =trainClass.colRange(1,2); //随机生成Y的值rng.fill(c,RNG::UNIFORM,Scalar(1),Scalar(HEIGHT));//***************4.为所有数据设置标签********** //前100个数据设为第一类labels.rowRange(0,NTRAINING_SAMPLES).setTo(1);//后100个数据设为第二类labels.rowRange(NTRAINING_SAMPLES,2*NTRAINING_ SAMPLES).setTo(2); //**************第二步:设置SVM参数*********** CvSVMParams params;//SVM类型:C-Support Vector Classificationparams.svm_type = SVM::C_SVC; params.C = 0.1; //和函数类型:Linear kernelparams.kernel_type = SVM::LINEAR; //终止准则:当迭代次数到达最大值后终止params.term_crit= TermCriteria(CV_TERMCRIT_ITER,(int) 1e7,1e-6);//**************第三步:训练SVM***********cout&lt;&lt;"开始训练过程"&lt;&lt;endl; //开始计时clock_t start,finish; double duration; start = clock(); //*************1.建立一个SVM实例********** CvSVM svm; //*************2.调用训练函数*************svm.train(trainData,labels,Mat(),Mat(),params); //结束计时finish = clock(); duration =(double)(finish-start) / CLOCKS_PER_SEC;cout&lt;&lt;"训练过程结束,共耗时:"&lt;&lt;duration&lt;&lt;"秒"&lt;&lt;endl; //************第四步:显示判决域************ //第一类用绿色;第二类用蓝色Vec3b green(0,100,0),blue(100,0,0); for(int i = 0; i &lt; image.rows; ++i) { for(int j = 0; j &lt; image.cols; ++j) { Mat sampleMat = (Mat_&lt;float&gt;(1,2)&lt;&lt;i,j);float response = svm.predict(sampleMat); if (response == 1){ image.at&lt;Vec3b&gt;(j,i) =green; } else if (response ==2){ image.at&lt;Vec3b&gt;(j,i) =blue; } } }//************第五步:显示训练数据************ //红色//负数会导致画出的图型是实心的int thick = -1;int lineType = 8; float px,py; //************1.第一类************* for(int i = 0; i &lt;NTRAINING_SAMPLES; ++i) { px = trainData.at&lt;float&gt;(i,0); py =trainData.at&lt;float&gt;(i,1);circle(image,Point((int)px,(int)py),3,Scalar(0,255,0));} //***********2.第二类**************** for(int i = NTRAINING_SAMPLES; i &lt; 2*NTRAINING_SAMPLES; ++i) { px = trainData.at&lt;float&gt;(i,0); py = trainData.at&lt;float&gt;(i,1);circle(image,Point((int)px,(int)py),3,Scalar(255,0,0));} //***********第六步:显示支持向量************* thick = 2; lineType = 8; //获取支持向量的个数int x =svm.get_support_vector_count(); for(int i = 0; i &lt; x; ++i) { const float* v =svm.get_support_vector(i);circle(image,Point((int)v[0],(int)v[1]),6,Scalar(128,128,128) ,thick,lineType); } imshow("分类结果",image); waitKey(0); return 0; } 其实我对SVM的理解也只是照猫画虎,当训练数据是高维情况时,也完全不知所措,以后要是需要在这方面有深入研究的话,在仔细考虑吧!。

机器学习笔记14-----SVM实践和分类器的性能的评价指标(了解python画图的技巧)

机器学习笔记14-----SVM实践和分类器的性能的评价指标(了解python画图的技巧)1.主要内容2.SVM的应⽤(1)利⽤SVM处理分类问题分类器的性能的评价指标:应⽤案例:accuracy=3/6=0.5 precision=3/5=0.6 recall=3/4=0.753.代码⽰例(1)鸢尾花SVM案例#!/usr/bin/python# -*- coding:utf-8 -*-import numpy as npfrom sklearn import svmfrom sklearn.model_selection import train_test_splitimport matplotlib as mplimport matplotlib.pyplot as pltdef iris_type(s):it = {b'Iris-setosa': 0, b'Iris-versicolor': 1, b'Iris-virginica': 2}return it[s]# 'sepal length', 'sepal width', 'petal length', 'petal width'iris_feature = u'花萼长度', u'花萼宽度', u'花瓣长度', u'花瓣宽度'def show_accuracy(a, b, tip):acc = a.ravel() == b.ravel()print(tip + '正确率:', np.mean(acc))if__name__ == "__main__":path = '8.iris.data'# 数据⽂件路径data = np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type})x, y = np.split(data, (4,), axis=1)x = x[:, :2]x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.6)# 分类器# clf = svm.SVC(C=0.1, kernel='linear', decision_function_shape='ovr')clf = svm.SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr')clf.fit(x_train, y_train.ravel())# 准确率print(clf.score(x_train, y_train)) # 精度y_hat = clf.predict(x_train)show_accuracy(y_hat, y_train, '训练集')print(clf.score(x_test, y_test))y_hat = clf.predict(x_test)show_accuracy(y_hat, y_test, '测试集')# 画图x1_min, x1_max = x[:, 0].min(), x[:, 0].max() # 第0列的范围x2_min, x2_max = x[:, 1].min(), x[:, 1].max() # 第1列的范围x1, x2 = np.mgrid[x1_min:x1_max:500j, x2_min:x2_max:500j] # ⽣成⽹格采样点grid_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点Z = clf.decision_function(grid_test) # 样本到决策⾯的距离print(Z)grid_hat = clf.predict(grid_test) # 预测分类值print(grid_hat)grid_hat = grid_hat.reshape(x1.shape) # 使之与输⼊的形状相同mpl.rcParams['font.sans-serif'] = [u'SimHei']mpl.rcParams['axes.unicode_minus'] = Falsecm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])x1_min, x1_max = x[:, 0].min(), x[:, 0].max() # 第0列的范围x2_min, x2_max = x[:, 1].min(), x[:, 1].max() # 第1列的范围x1, x2 = np.mgrid[x1_min:x1_max:500j, x2_min:x2_max:500j] # ⽣成⽹格采样点grid_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light)plt.scatter(x[:, 0], x[:, 1], c=np.squeeze(y), edgecolors='k', s=50, cmap=cm_dark) # 样本 plt.scatter(x_test[:, 0], x_test[:, 1], s=120, facecolors='none', zorder=10) # 圈中测试集样本 plt.xlabel(iris_feature[0], fontsize=13)plt.ylabel(iris_feature[1], fontsize=13)plt.xlim(x1_min, x1_max)plt.ylim(x2_min, x2_max)plt.title(u'鸢尾花SVM⼆特征分类', fontsize=15)plt.grid()plt.show()效果图:(2)#!/usr/bin/python# -*- coding:utf-8 -*-import numpy as npfrom sklearn import svmimport matplotlib as mplimport matplotlib.colorsimport matplotlib.pyplot as pltdef show_accuracy(a, b):acc = a.ravel() == b.ravel()print('正确率:%.2f%%' % (100 * float(acc.sum()) / a.size))if__name__ == "__main__":data = np.loadtxt('14.bipartition.txt', dtype=np.float, delimiter='\t')x, y = np.split(data, (2, ), axis=1)y[y == 0] = -1y = y.ravel()# 分类器clfs = [svm.SVC(C=0.3, kernel='linear'),svm.SVC(C=10, kernel='linear'),svm.SVC(C=5, kernel='rbf', gamma=1),svm.SVC(C=5, kernel='rbf', gamma=4)]titles = 'Linear,C=0.3', 'Linear, C=10', 'RBF, gamma=1', 'RBF, gamma=4'x1_min, x1_max = x[:, 0].min(), x[:, 0].max() # 第0列的范围x2_min, x2_max = x[:, 1].min(), x[:, 1].max() # 第1列的范围x1, x2 = np.mgrid[x1_min:x1_max:500j, x2_min:x2_max:500j] # ⽣成⽹格采样点grid_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点cm_light = matplotlib.colors.ListedColormap(['#77E0A0', '#FF8080'])cm_dark = matplotlib.colors.ListedColormap(['g', 'r'])matplotlib.rcParams['font.sans-serif'] = [u'SimHei']matplotlib.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(10,8), facecolor='w')for i, clf in enumerate(clfs):clf.fit(x, y)y_hat = clf.predict(x)show_accuracy(y_hat, y) # 准确率# 画图print('⽀撑向量的数⽬:', clf.n_support_)print('⽀撑向量的系数:', clf.dual_coef_)print('⽀撑向量:', clf.support_)printplt.subplot(2, 2, i+1)grid_hat = clf.predict(grid_test) # 预测分类值grid_hat = grid_hat.reshape(x1.shape) # 使之与输⼊的形状相同plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light, alpha=0.8)plt.scatter(x[:, 0], x[:, 1], c=y, edgecolors='k', s=40, cmap=cm_dark) # 样本的显⽰plt.scatter(x[clf.support_, 0], x[clf.support_, 1], edgecolors='k', facecolors='none', s=100, marker='o') # ⽀撑向量 z = clf.decision_function(grid_test)z = z.reshape(x1.shape)plt.contour(x1, x2, z, colors=list('krk'), linestyles=['--', '-', '--'], linewidths=[1, 2, 1], levels=[-1, 0, 1])plt.xlim(x1_min, x1_max)plt.ylim(x2_min, x2_max)plt.title(titles[i])plt.grid()plt.suptitle(u'SVM不同参数的分类', fontsize=18) plt.tight_layout(2)plt.subplots_adjust(top=0.92)plt.show()效果图:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录一、LibSVM文件结构说明 (2)二、LibSVM安装及测试 (2)1.下载libsvm (2)2.解压至指定目录 (2)3.设置路径 (3)4.编译libsvm (3)5.执行编译 (4)6.安装测试 (6)三、LibSVM基础使用 (7)四、LibSVM使用规范 (9)1. libSVM的数据格式 (9)2. svmscale的用法 (9)3. svmtrain的用法 (10)4. svmpredict 的用法 (12)五、逐步深入LibSVM (12)1. svm_group_class (14)2. 多类判别的one-against-one (15)1)1-V-R方式 (15)2)1-V-1方式 (15)3)有向无环图(DAG-SVM) (15)3. hessian矩阵的内存处理 (16)4. 数据选择select_working_set(i,j) (17)5. 停止准则 (18)6. 因子α的更新 (18)7. 数据缩放do_shrinking() (19)8. 截距b的计算 (19)六、分界线的输出 (20)七、easy.py和grid.py的使用 (22)一、LibSVM文件结构说明LibSVM是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机的库,可以很方便的对数据做分类或回归。

这套库可以从.tw/~cjlin/免费获得。

下载.zip格式的版本,解压后可以看到,主要有5个文件夹和一些c++源码文件。

Java——主要是应用于java平台;Python——是用来参数优选的工具,稍后介绍;svm-toy——一个可视化的工具,用来展示训练数据和分类界面,里面是源码,其编译后的程序在windows 文件夹下;tools——主要包含四个python文件,用来数据集抽样(subset),参数优选(grid),集成测试(easy), 数据检查(checkdata);windows——包含libSVM四个exe程序包,我们所用的库就是他们。

里面还有个heart_scale,是一个样本文件,可以用记事本打开,用来测试用的。

其他.h和.cpp文件都是程序的源码,可以编译出相应的.exe文件。

其中,最重要的是svm.h和svm.cpp文件,svm-predict.c、svm-scale.c和svm-train.c(还有一个svm-toy.c在svm-toy文件夹中)都是调用的这个文件中的接口函数,编译后就是windows下相应的四个exe程序。

另外,里面的README 跟FAQ 也是很好的文件,对于初学者如果E文过得去,可以看一下。

二、LibSVM安装及测试1.下载libsvm.tw/~cjlin/libsvm/2.解压至指定目录将libsvm解压至D:\MATLAB\R2010a\toolbox下,你也可以解压至你喜欢的地方。

3.设置路径下载下来的借口包里有svm的一些源文件,没有可执行的exe文件,所以,必须先将svmtrain等源文件编译为matlab可以使用的dll等文件。

于是先选择编译器,如下:4.编译libsvm首先在matlab设置当前目录为D:\MATLAB\R2010a\toolbox\libsvm-3.12\matlab5.执行编译在matlab命令窗口中输入mex -setup显示输入n选择编译器:【21】输入n输入编译器所在路径再次确认自己的选择,输入y编译器选择好了之后,用make.m编译命令窗口输入make可以看到新编译出4个文件libsvmread.mexw32,libsvmwrite.mexw32,svmtrain.mexw32,svmpredict.mexw326.安装测试在命令窗口中输入load heart_scale;此时需注意,libsvm 3.12中提供的是c++版本的数据集heart_scale,这里需要加载matlab版本的数据集。

这两个数据集有什么不同呢?C++版本的数据集里面如果某一个样本的某一个特征为0,这个特征可以不写在数据集中,但是在matlab版本中,必须要写出来。

否则的话,会报这样一个错误:此时你可以选择下载matlab型的数据集,给一个链接。

/detail/boruoshui/4881338然后读取数据集libsvmread('heart_scale');完成该步骤后发现Workspace中出现了heart_scale_inst 和heart_scale_label,说明正确。

model=svmtrain(heart_scale_inst ,heart_scale_label)[predict_lebel,accuracy]=svmpredict(heart_scale_label,heart_scale_inst,model)由于libsvm新的版本对于输出结果的重新设定[predict_lebel,accuracy]=svmpredict(heart_scale_label,heart_scale_inst,model)命令会报BUG改为如下命令即可。

(老版本不用改变。

本文是libsvm-3.12。

)model=svmtrain(heart_scale_label,heart_scale_inst)[predicted_label, accuracy, decision_values]=svmpredict(heart_scale_label,heart_scale_inst,model)证明libsvm安装成功,可以进行其他的实验了。

三、LibSVM基础使用1. 把LibSVM包解压到相应的目录,比如D:/libsvm。

2. 在电脑“开始”的“运行”中输入cmd,进入DOS环境。

定位到D:/ libsvm/windows下3. 进行libsvm训练,输入命令:(这里要注意文件的名字,2.89以前版本都是svmtrain.exe)svm-train heart_scale train.modelheart_scale ——是目录下的已经存在的样本文件,要换成自己的文件,只需改成自己的文件名就可以了train.model ——是创建的结果文件,保存了训练后的结果可以看到结果:#iter——为迭代次数nu——为选择的核函数类型的参数obj——为SVM文件转换为的二次规划求解得到的最小值rho——为判决函数的偏置项b,nSV 为标准支持向量个数(0<a[i]<c)nBSV——为边界上的支持向量个数(a[i]=c)Total nSV——为支持向量总个数(对于两类来说,因为只有一个分类模型Total nSV = nSV,但是对于多类,这个是各个分类模型的nSV之和)。

在目录下,还可以看到产生了一个train.model文件,可以用记事本打开,记录了训练后的结果。

svm_type c_svc //所选择的svm类型,默认为c_svckernel_type rbf //训练采用的核函数类型,此处为RBF核gamma 0.0769231 //RBF核的参数γnr_class 2 //类别数,此处为两分类问题total_sv 132 //支持向量总个数rho 0.424462 //判决函数的偏置项blabel 1 -1 //原始文件中的类别标识nr_sv 64 68 //每个类的支持向量机的个数SV //以下为各个类的权系数及相应的支持向量1 1:0.166667 2:1 3:-0.333333 … 10:-0.903226 11:-1 12:-1 13:10.5104832128985164 1:0.125 2:1 3:0.333333 … 10:-0.806452 12:-0.333333 13:0.5………..-1 1:-0.375 2:1 3:-0.333333…. 10:-1 11:-1 12:-1 13:1-1 1:0.166667 2:1 3:1 …. 10:-0.870968 12:-1 13:0.5四、LibSVM使用规范需要说明的是,2.89版本以前,都是svmscale、svmtrain和svmpredict,最新的是svm-scale、svm-train 和svm-predict,要是用不习惯,只需要把那四个exe文件名去掉中间的短横线,改成svmscale、svmtrain和svmpredict就可以了,我们还是按原来函数名的讲。

1. libSVM的数据格式Label 1:value 2:value ….Label:是类别的标识,比如上节train.model中提到的1 -1,你可以自己随意定,比如-10,0,15。

当然,如果是回归,这是目标值,就要实事求是了。

Value:就是要训练的数据,从分类的角度来说就是特征值,数据之间用空格隔开比如: -15 1:0.708 2:1056 3:-0.3333需要注意的是,如果特征值为0,特征冒号前面的(姑且称做序号)可以不连续。

如:-15 1:0.708 3:-0.3333表明第2个特征值为0,从编程的角度来说,这样做可以减少内存的使用,并提高做矩阵内积时的运算速度。

我们平时在matlab中产生的数据都是没有序号的常规矩阵,所以为了方便最好编一个程序进行转化。

2. svmscale的用法svmscale是用来对原始样本进行缩放的,范围可以自己定,一般是[0,1]或[-1,1]。

缩放的目的主要是1)防止某个特征过大或过小,从而在训练中起的作用不平衡;2)为了计算速度。

因为在核计算中,会用到内积运算或exp运算,不平衡的数据可能造成计算困难。

用法:svmscale [-l lower] [-u upper][-y y_lower y_upper][-s save_filename][-r restore_filename] filename其中,[]中都是可选项:-l:设定数据下限;lower:设定的数据下限值,缺省为-1-u:设定数据上限;upper:设定的数据上限值,缺省为1-y:是否对目标值同时进行缩放;y_lower为下限值,y_upper为上限值;-s save_filename:表示将缩放的规则保存为文件save_filename;-r restore_filename:表示将按照已经存在的规则文件restore_filename进行缩放;filename:待缩放的数据文件,文件格式按照libsvm格式。

默认情况下,只需要输入要缩放的文件名就可以了,比如(已经存在的文件为test.txt) :svmscale test.txt这时,test.txt中的数据已经变成[-1,1]之间的数据了。

相关文档
最新文档