libsvm学习(五)——分界线的输出(转)

对于学习SVM人来说,要判断SVM效果,以图形的方式输出的分解线是最直观的。LibSVM自带了一个可视化的程序svm-toy,用来输出类之间的分界线。他是先把样本文件载入,然后进行训练,通过对每个像素点的坐标进行判断,看属于哪一类,就附上那类的颜色,从而使类与类之间形成分割线。我们这一节不讨论svm-toy怎么使用,因为这个是“傻瓜”式的,没什么好讨论的。这一节我们主要探讨怎么结合训练结果文件,自己编程输出分界线。

为什么说是分界线呢,其实严格说来是分解超平面,但是我们为了能直观用绘图工具绘(比如matlab)出图来只能输出具有二维(也就是特征数是2)的样本分界,因此也就成了线了。好了,闲话少说,进入正题。要绘分界线,就要用到训练结果,我们在第二节和第三节都讨论了,训练结果(或训练模型)文件怎么输出,但是,没怎么详细说明怎么使用训练结果,现在具体说明。下面是两个模型文件:

               

图5.1 两类模型文件                                 图5.2 三类模型文件

从图5.1和5.2比较可以看出,两类只存在一个分类器,因此每个支持向量对应的系数α(也就是SV的第一排),也只有 1个(当然,截距rho也只有一个)。这种情况最简单,只要把相应的支持向量和α的值带入方程:

                                (5.1)

找到为0的解,就是分界点了。(式中,有些文献是+b,libSVM采用的是-b)

对于三类或多类时,情况就比较复杂。我们原来讨论过,对于类数k>2的情况,分类器个数为k×(k-1)/2个,那么对应的b值(也就是rho)应该也是k×(k-1)/2个。那么每个支持向量对应的系数α是多少呢?是k-1个,因为每个支持向量(sv)与其他每个类都有一个系数相对应。当然,和有的类对应时可能不是标准支持向量(0<alpha[i]<C),但是至少和其中一个类对应是标准的。我们先看一下图5.2的SV的数据结构:


各nSV对应的αiyi


特征1


特征2


类0(label为-1)

前13个


0 - V - 1


0 - V - 2


1:0.297595


2:1.197805


0.4800095239454689


0.2016577869168293


类1(label为0)

中间9个


1 - V - 0


1 - V - 2


1:3.621706


2:1.263636


-0.6580578158072528


0.7036762846823739


类2(label为1)

后8个


2 - V - 0


2 - V - 1


1:8.296066


2:7.225341


-0.7056286598529473


-0.6494097661702236

从表中,可以看出,每个支持向量(SV)都有相应的k-1(这里的k为3)个α,后面就是向量的数据。因此,输出分界线时,只要认清系数的位置就可以了。如要输出类0和类2之间的分界线,就要带入类0的第二列和类2的第1列中的α。

这里需要重点说明的是:文件输出的不是单纯的α,实际上是αiyi(这里的yi是在训练时的+1或-1,而不是原始样本的label),因此在带入5.1式时,不需要判断yi的值了。

了解了数据结构以后,就是求解方程。5.1式是个多元方程(这和x的维数有关,这里讨论的是2维的,因此是二元方程),而只有一个等式,因此要对其中一个参数做定常处理。先求出其中一个参数的范围,不妨设为x[0](在绘图时相当于x坐标轴)x_max和x_min,然后分成100等分,对每一个节点处

x[0]= i×(x_max- x_min)/100+ x_min

这样,x[0]就相当于固定了,然后代入5.1式求x[1](也就是y)。这就转化成了一元方程,可以采用传统的数学解法,这里,我采用的是网络遍历法。也就是对x[1]也分成100分进行遍历,把节点处的x[1]:

x[1]= j×(y_max- y_min)/100+ y_min

代入5.1式,看是否接近于0,如果接近0,说明此点是边界点,然后输出坐标就可以了。

for(i = 0; i < 100; i ++)

for(j = 0; j < 100; j ++)

{

X[0] = x[0]i;

X[1] = x[1]j;

if( )

cout << X[0] << “ “ <<  X[1] <<endl;

}

分界点坐标输出以后,就可以用matlab把分界线绘制出来了。

时间: 2024-11-05 02:39:43

libsvm学习(五)——分界线的输出(转)的相关文章

LibSVM学习

原文:http://blog.csdn.net/passball/article/details/7673725 代码文件主要针对Matlab进行说明,但个人仍觉得讲解的支持向量机内容非常棒,可以做为理解这一统计方法的辅助资料; LibSVM是台湾林智仁(Chih-Jen Lin)教授2001年开发的一套支持向量机的库,这套库运算速度还是挺快的,可以很方便的对数据做分类或回归.由于libSVM程序小,运用灵活,输入参数少,并且是开源的,易于扩展,因此成为目前国内应用最多的SVM的库. 这套库可以

Cmdlet开发与学习(五)

Parameter       在声明cmdlet参数的时候,我们使用了Parameter标识符,在这个标识符中,有些参数需要了解到. 强制参数 设置Mandatory=true即可. 对于强制参数,不管是在命令行中绑定,还是通过管道输入,在命令逻辑执行之前,它就必须绑定好.如果强制参数没有参数值的话,PowerShell会弹出对话框,要求用户提供参数值. 位置参数.       Position= n       有时,我们在使用Powershell的时候,发现仅仅是输入参数值,并没有指定具体

libsvm学习(三)——libsvm使用规范(转)

其实,这部分写也是多余,google一下“libsvm使用”,就会N多的资源,但是,为了让你少费点心,在这里就简单的介绍一下,有不清楚的只有动动你的mouse了.需要说明的是,2.89版本以前,都是svmscale.svmtrain和svmpredict,最新的是svm-scale.svm-train和svm-predict,要是用不习惯,只需要把那四个exe文件名去掉中间的短横线,改成svmscale.svmtrain和svmpredict就可以了,我们还是按原来函数名的讲. 1. libSV

Hadoop学习(五)-MapReduce架构原理

概述 hadoop主要是用于应对海量数据的存储和计算的,前面hdfs文件系统,则重点是用于海量数据的存储.那么有了这么多数据,我们又该怎么在这些数据里面来提取我们需要的信息呢?这个时候hadoop中出现了一个非常重要的成员MapReduce.MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算.注意这个并行运算,它不再是我们传统意义上的串行计算,它可以在不同的进程中进行并行的运算.概念"Map(映射)"和"Reduce(归约)",是它们的主要思

Python基础学习五

Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出键值对. for key in dict: #迭代键 for val in dict.value(): #迭代值 for k,v in dict.items(): #迭代键值对 当迭代列表时,通过内置函数enumerate()可以迭代出索引加值. for i in list #迭代列表 for i

Beaglebone Back学习五(PWM测试)

PWM测试 参考链接 1 Enable PWM on BeagleBone with Device Tree overlays 2Using PWM on the Beaglebone Black 3 Beaglebone Coding 101: Buttons and PWM 4 Using PWM outputs 5 beaglebone-black-cpp-PWM 6 Enabling PWM Support in the kernel 7 Beaglebone Back学习五(PWM测试

TweenMax动画库学习(五)

目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            TweenMax动画库学习(四)            TweenMax动画库学习(五)  

NodeJS学习五 之网页显示

我们新建一个Server.js. 然后运行cmd 找到server.js 路径.  node server.js 浏览器中输入http://localhost:8888/ 你会发现,网页上出现了 Hello World NodeJS学习五 之网页显示,布布扣,bubuko.com

Objective C 快速入门学习五

<一>继承和多态 @class Complex 声明类(同C++) 子类函数成员 super 访问父类 同C++类似 1.通过继承 在子类中添加新方法 2.通过继承 在子类中添加新成员 3.通过继承 实现多态(实现比较简单,通过Id通用类型作为父类) 4.重载 5.抽象类abstract作用:创建子类更容易:提供了处理所有派生子类的公共接口:抽象方法制定了标准协议,规范子类必须实现. 6.通用类型id,编译时不会做类型检查,在运行时才会动态绑定具体类型,指出错误. 静态类型在编译阶段就会指出错

C#学习笔记 实验3_1 输出奇数练习

// ACM 进度先缓一缓,这学期过去一半了,把落下的课补回来,开始C#学习 第03次实验 题目1 1.编写一个控制台应用.输入一组整数,输出所有的奇数. 提示:使用字符串的Split函数 Split函数用法: Split函数 返回基于 0 的一维数组,其中包含指定数目的子字符串. 语法 Split(expression[, delimiter[, count[, start]]]) Split 函数的语法有以下参数: 参数 描述 expression 必选.字符串表达式,包含子字符串和分隔符.