svm理论与实验之15:分界线


徐海蛟博士Teaching.


要判断SVM效果,以图形的方式输出的分解线是最直观的。LibSVM自带了一个可视化的程序svm-toy,用来输出类之间的分界线。他是先把样本文件载入,然后进行训练,通过对每个像素点的坐标进行判断,看属于哪一类,就附上那类的颜色,从而使类与类之间形成分割线。这个在第13课讲述过了。


如何自己DIY编程输出分界线呢?


分界线,其实严格说来是分界超平面。要绘分界线,就要用到训练结果,我们在第二节和第三节都讨论了,训练结果(或训练模型)文件怎么输出,但是,没怎么详细说明怎么使用训练结果,现在具体说明。下面是两个模型文件:

svm_type c_svc

kernel_type rbf

gamma 0.0769231

nr_class 2

total_sv 132

rho 0.424462

label 1 -1

nr_sv 64 68

SV

...

<两类模型文件>


svm_type c_svc

kernel_type rbf

gamma 0.0769231

nr_class 3

...

<三类模型文件>


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

(15.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),因此在带入15.1式时,不需要判断yi的值了。


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

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

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

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

代入15.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把分界线绘制出来了。


你可能感兴趣的:(数据挖掘,大数据,SVM,智能搜索,徐海蛟博士,徐海蛟)