OnlineSVR算法原理(3)

来源:互联网 发布:windows 终端仿真软件 编辑:程序博客网 时间:2024/05/16 08:34

3 伪代码算法

 

       这一节将阐述Online SVR算法的具体过程。这是该算法的核心部分,为了能更好地理解我列出了算法所有要用到的公式。

 

3.1 学习算法

 

3.1.1 输入与输出

 

       在一系列的数学证明和分析之后,我们终于可以用伪代码表示出来该算法,下面是一个Online SVR需要输入的部分:

 

INPUTS

1. TRAININGSET { xi, yi, i=1..l}

2. WHEIGHTS qi, i=1..l

3. BIAS b

4. TRAININGSET PARTITION INTO SUPPOTSET(S) , ERRORSET(E)

AND REMAININGSET(R)

5. PARAMS: e , C , KERNELTYPE AND KERNELPARAMs

6. R MATRIX

7. NEW SAMPLE C = (xc, yc)

 

       在训练开始,TrainningSetCoefficientsSupportSetErrorSetRemainingSet以及R矩阵都是空的,而且Bias也是为零的。注意上面提到的矩阵都应该储存起来,以便在训练新样本时使用。但在常用的SVR训练算法中只用到了TrainingSetWeights以及Bias

 

OUTPUTS

1. NEW TRAININGSET { xi, yi, i=1..l+1}

2. NEW COEFFICIENTS qi, i=1..l+1

3. NEW BIAS b

4. NEW TRAININGSET PARTITION

5. NEW R MATRIX

 

可以看到输出中包含了所有输入需要更新的值。

 

3.1.2 新样本训练的伪代码

      

下面是新样本训练时的伪代码:

 

NEW TRAINING ALGORITHM

 

1.     ADD (xc, yc) AT THE TRAININGSET

2.     SET qc = 0

3.     COMPUTE f(xc) AND h(xc)

4.     IF (|h(xc)| < e)

4.1         ADD NEWSAMPLE TO THE REMAININGSET AND EXIT

5.     COMPUTE h(xi), i=1..l

6.     WHILE (NEWSAMPLE IS NOT ADDED INTO A SET)

6.1         UPDATE THE VALUES b AND g

6.2         FIND LEAST VARIATIONS (Lc1, Lc2, Ls, Le, Lr)

6.3         FIND MIN VARIATION Dqc = min(Lc1, Lc2, Ls, Le, Lr)

6.4         LET FLAG THE CASE NUMBER THAT DETERMINATES Dqc

                 (Lc1=1, Lc2=2, Ls=3, Le=4, Lr=5)

6.5         LET xl THE SAMPLE THAT DETERMINES Dqc

6.6         UPDATE qc, qi, i=1..l AND b

6.7         UPDATE h(xi), i Î E ÈR

 

6.8         SWITCH FLAG

6.8.1             (FLAG = 1)

6.8.1.1                 ADD NEWSAMPLE TO SUPPORTSET

6.8.1.2                 ADD NEWSAMPLE TO R MATRIX

6.8.1.3                 EXIT

6.8.2             (FLAG = 2)

6.8.2.1                 ADD NEWSAMPLE TO ERRORSET

6.8.2.2                 EXIT

6.8.3             (FLAG = 3)

6.8.3.1                 IF (ql = 0)

6.8.3.1.1                     MOVE SAMPLE l FROM SUPPORT TO REMAININGSET

6.8.3.1.2                     REMOVE SAMPLE l FROM R MATRIX

6.8.3.1                 ELSE [ql = |C|]

6.8.3.2.1                     MOVE SAMPLE l FROM SUPPORT TO ERRORSET

6.8.3.2.2                     REMOVE SAMPLE l FROM R MATRIX

6.8.4             (FLAG = 4)

6.8.4.1                 MOVE SAMPLE l FROM ERROR TO SUPPORT

6.8.4.2                 ADD SAMPLE l TO R MATRIX

6.8.5             (FLAG = 5)

6.8.5.1                 MOVE SAMPLE l FROM REMAINING TO SUPPORTSET

6.8.5.2                 ADD SAMPLE l TO R MATRIX

 

在算法的开始,Online SVR首先会检查新样本是否可直接加入到RemainingSet中。这是最好的一种情形,因为此时的算法很快,而且不会增加向量机的复杂度。若不能直接加入到RemainingSet,就让它不断循环,直到该新样本加入到Support集合或者Error集合(情形1和情形2 )。在每次迭代过程中,都会有一个样本(未必只是新样本)从一个集合转移到另外一个集合。而且每次转移都会影响到Support集合的元素,所以每次迭代都要更新R矩阵,因为它与Support集合中的样本是密切相关的。由于R的更新频繁而且运算量很大,在下一节中我们将给出一个快速更新R矩阵的详细方法。

 

3.1.3 推演方程

 

       在本节中先列出算法中用到的主要方程,若想了解更多细节,请查看前一章的内容。在算法开始之前计算出目标函数f 和边缘函数h

      

      

f(xc) =

l
å
i=1 

(qi Qic ) + b

(1)


h(xc) = f(xc) - yc

(2)

 

在每次迭代中,用b g  来计算最小变化量:

 

b =

é
ê
ê
ê
ê
ê
ë

bb

bs1

:

bsls

 

ù
ú
ú
ú
ú
ú
û

= - R

é
ê
ê
ê
ê
ê
ë

1

Qs1 c

:

Qsls c

 

ù
ú
ú
ú
ú
ú
û

 

(3)


 

g =

é
ê
ê
ê
ë

DQn1c

:

DQnlnc

 

ù
ú
ú
ú
û

+

é
ê
ê
ê
ê
ê
ë

0

1

¼

1

1

Qn1 s1

¼

Qn1 sls

:

:

···

:

1

Qnln s1

¼

Qnln sls

 

ù
ú
ú
ú
ú
ú
û

b

 

(4)

 

找到最小变化量,然后更新qcqi | i Î S b h(xi)| i Î E ÈR:

 

qc = qc + Dqc

(5)


qi = qi + Dqi

(6)


b = b + Db

(7)


 

 

é
ê
ê
ê
ê
ê
ë

Db

Dqs1

:

Dqsls

 

ù
ú
ú
ú
ú
ú
û

= b Dqc

 

(8)


h(xi) = h(xi) + Dh(xi)

(9)


 

 

é
ê
ê
ê
ë

Dh(xn1)

:

Dh(xnln)

 

ù
ú
ú
ú
û

= g Dqc

 

(10)

 

3.1.4 寻找最小变化量

 

       综合前一章的内容,我们写出样本移动时所要的条件。在分析所有可能出现的移动之前,非常有必要事先确定好一个样本将要移动的方向。对Learn算法而言,我们欲把样本的Hc

值减少到|e|,故取与Hc符号相反的方向:

 

DIRECTION = sign(-Hc)

(11)

 

现在开始确定移动步骤。要考虑的第一个变化量是把新样本的Hc值减小到|e|,最终把它划为Support集合中。变化量为:

 

 

LC1 VARIATION

 

IF ((qc > 0)  Ú (qc=0  Ù Hc < 0))

     LC1 = (-Hc -e)/gc

ELSE

     LC1 = (-Hc +e)/gc

END

 

第二个变化量是计算把新样本归入Error集合所需的差值:

 

LC2 VARIATION

 

IF (DIRECTION > 0)

     LC2 = -qc +C

ELSE

     LC2 = -qc -C

END

 

第三个变量是计算把Support样本归入ErrorRemaining集合所需的差值。该样本的移动方向取决于新样本的移动方向和bi的值。如果bi的值是负的,那么该样本和新样本的移动方向相反。注意:这里的索引i 不是指它在b的位置,而是指它在Support 集合中的位置,因为b的第一个位置是b的值。具体的变化量为:

 

LS VARIATIONS

 

FOREACH i Î SUPPORTSET

     IF (DIRECTION *bi > 0)

         IF (Hi > 0)   [Hi=e]

             IF (qi < -C)

                 LSi = (-qi -C) / bi

             ELSEIF (qi < = 0)

                 LSi = -qi / bi

             ELSE   [qi > 0]

                 LSi = DIRECTION*INF

             END

         ELSE   [Hi=-e]

             IF (qi < 0)

                 LSi = -qi / bi

             ELSEIF (qi < = C)

                 LSi = (-qi +C) / bi

             ELSE   [qi > +C]

                 LSi = DIRECTION*INF

             END

         END

 

 

 

 

     ELSE [DIRECTION*bi < 0]

         IF (Hi > 0)   [Hi=-e]

             IF (qi < -C)

                 LSi = DIRECTION*INF

             ELSEIF (qi < = 0)

                 LSi = (-qi -C) / bi

             ELSE    [qi > 0]

                 LSi = -qi / bi

             END

         ELSE    [Hi=e]

             IF (qi < 0)

                 LSi = DIRECTION*INF

             ELSEIF (qi < = C)

                 LSi = -qi / bi

             ELSE    [qi > +C]

                 LSi = (-qi +C) / bi

             END

     END

END

 

第四个变化量是计算把Error样本归入Support集合所要的差值。该样本的方向取决于新样本的移动方向和gi的值。如果gi为负的,那么该样本与新样本的移动方向相反。变化量如下:

 

LE VARIATIONS

 

FOREACH i Î ERRORSET

     IF (DIRECTION*gi > 0)

         IF (qi > 0)   [qi=C]

             IF (Hi < -e)

                 LEi = (-Hi -e)/gi

             ELSE

                 LEi = DIRECTION*INF

             END

         ELSE [qi-=C]

             IF (Hi < e)

                 LEi = (-Hi +e)/gi

             ELSE

                 LEi = DIRECTION*INF

             END

         END

     END

 

 

 

 

     ELSE [DIRECTION*gi < 0]

         IF (qi > 0)   [qi=C]

             IF (Hi > -e)

                 LEi = (-Hi -e)/gi

             ELSE

                 LEi = DIRECTION*INF

             END

         ELSE [qi-=C]

             IF (Hi > e)

                 LEi = (-Hi +e)/gi

             ELSE

                 LEi = DIRECTION*INF

             END

         END

     END

END

 

最后一个变化量是计算把Remainning样本归入Support集合所要的差值。该样本的移动方向取决于新样本的方向和gi的值。如果gi的值是负的,该样本和新样本的移动方向相反。变化量如下:

 

LR VARIATIONS

 

FOREACH i Î ERRORSET

     IF (DIRECTION*gi > 0)

         IF (Hi < -e)

             LRi = (-Hi -e)/gi

         ELSEIF (Hi < +e)

             LRi = (-Hi +e)/gi

         ELSE

             LRi = DIRECTION*INF

         END

     ELSE [DIRECTION*gi < 0]

         IF (Hi > +e)

             LRi = (-Hi +e)/gi

         ELSEIF (Hi > -e)

             LRi = (-Hi -e)/gi

         ELSE

             LRi = DIRECTION*INF

         END

     END

END

 

从上面的语句中考察了看似不可能出现的情况,但实际上对这个不稳定的浮点运算问题来说,考虑这些情况都将是有用的。

 

3.1.5 更新R矩阵