3 伪代码算法
这一节将阐述Online SVR算法的具体过程。这是该算法的核心部分,为了能更好地理解我列出了算法所有要用到的公式。
3.1 学习算法
3.1.1 输入与输出
在一系列的数学证明和分析之后,我们终于可以用伪代码表示出来该算法,下面是一个Online SVR需要输入的部分:
|
在训练开始,TrainningSet,Coefficients,SupportSet,ErrorSet,RemainingSet以及R矩阵都是空的,而且Bias也是为零的。注意上面提到的矩阵都应该储存起来,以便在训练新样本时使用。但在常用的SVR训练算法中只用到了TrainingSet,Weights以及Bias。
|
可以看到输出中包含了所有输入需要更新的值。
3.1.2 新样本训练的伪代码
下面是新样本训练时的伪代码:
|
在算法的开始,Online SVR首先会检查新样本是否可直接加入到RemainingSet中。这是最好的一种情形,因为此时的算法很快,而且不会增加向量机的复杂度。若不能直接加入到RemainingSet,就让它不断循环,直到该新样本加入到Support集合或者Error集合(情形1和情形2 )。在每次迭代过程中,都会有一个样本(未必只是新样本)从一个集合转移到另外一个集合。而且每次转移都会影响到Support集合的元素,所以每次迭代都要更新R矩阵,因为它与Support集合中的样本是密切相关的。由于R的更新频繁而且运算量很大,在下一节中我们将给出一个快速更新R矩阵的详细方法。
3.1.3 推演方程
在本节中先列出算法中用到的主要方程,若想了解更多细节,请查看前一章的内容。在算法开始之前计算出目标函数f 和边缘函数h :
| (1) |
| (2) |
在每次迭代中,用b 和 g 来计算最小变化量:
| (3) |
| (4) |
找到最小变化量,然后更新qc,qi | i Î S ,b 和 h(xi)| i Î E ÈR:
| (5) |
| (6) |
| (7) |
| (8) |
| (9) |
| (10) |
3.1.4 寻找最小变化量
综合前一章的内容,我们写出样本移动时所要的条件。在分析所有可能出现的移动之前,非常有必要事先确定好一个样本将要移动的方向。对Learn算法而言,我们欲把样本的Hc
值减少到|e|,故取与Hc符号相反的方向:
| (11) |
现在开始确定移动步骤。要考虑的第一个变化量是把新样本的Hc值减小到|e|,最终把它划为Support集合中。变化量为:
|
第二个变化量是计算把新样本归入Error集合所需的差值:
|
第三个变量是计算把Support样本归入Error或Remaining集合所需的差值。该样本的移动方向取决于新样本的移动方向和bi的值。如果bi的值是负的,那么该样本和新样本的移动方向相反。注意:这里的索引i 不是指它在b的位置,而是指它在Support 集合中的位置,因为b的第一个位置是b的值。具体的变化量为:
|
|
第四个变化量是计算把Error样本归入Support集合所要的差值。该样本的方向取决于新样本的移动方向和gi的值。如果gi为负的,那么该样本与新样本的移动方向相反。变化量如下:
|
|
最后一个变化量是计算把Remainning样本归入Support集合所要的差值。该样本的移动方向取决于新样本的方向和gi的值。如果gi的值是负的,该样本和新样本的移动方向相反。变化量如下:
|
从上面的语句中考察了看似不可能出现的情况,但实际上对这个不稳定的浮点运算问题来说,考虑这些情况都将是有用的。
3.1.5 更新R矩阵