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

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

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

                  5.1               5.2

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

 

     从图5.15.2比较能够看出,两类只存在一个分类器,所以每一个支持向量对应的系数α(也就是SV的第一排),也只有 1个(固然,截距rho也只有一个)。这种状况最简单,只要把相应的支持向量和α的值带入方程: 数据结构

 5.3                                (5.1)工具

 

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

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

 

nSV对应的αiyiorm

特征1ci

特征2数学

0(label-1)

13

0 - V - 1

0 - V - 2

 

1:0.297595

 

2:1.197805

0.4800095239454689

0.2016577869168293

1(label0)

中间9

1 - V - 0

1 - V - 2

 

1:3.621706

 

2:1.263636

-0.6580578158072528

0.7036762846823739

2(label1)

8

2 - V - 0

2 - V - 1

 

1:8.296066

 

2:7.225341

-0.7056286598529473

-0.6494097661702236

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

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

      了解了数据结构之后,就是求解方程。5.1式是个多元方程(这和x的维数有关,这里讨论的是2维的,所以是二元方程),而只有一个等式,所以要对其中一个参数作定常处理。先求出其中一个参数的范围,不妨设为x[0](在绘图时至关于x坐标轴)x_maxx_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( 5.4)

 

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

                                                        }

 

    分界点坐标输出之后,就能够用matlab把分界线绘制出来了。

相关文章
相关标签/搜索