SVM缩放输入值(svm scaling input values)

2019-07-21 17:12发布

我使用LIBSVM。 说我的特征值是按以下格式:

                         instance1 : f11, f12, f13, f14
                         instance2 : f21, f22, f23, f24
                         instance3 : f31, f32, f33, f34
                         instance4 : f41, f42, f43, f44
                         ..............................
                         instanceN : fN1, fN2, fN3, fN4

我觉得有两个比例可以应用。

  1. 缩放每个实例向量,使得每个矢量具有零均值和单位方差。

      ( (f11, f12, f13, f14) - mean((f11, f12, f13, f14) ). /std((f11, f12, f13, f14) ) 
  2. 缩放上述矩阵到一个范围的每个式柱。 例如[-1,1]

据我的实验与RBF内核(LIBSVM)我发现第二缩放(2)提高了约10%的结果。 我不明白为什么(2)给了我一个更好的结果的原因。

可能有人给我解释一下什么是应用缩放,为什么第二个选项让我提高成绩的原因是什么?

Answer 1:

做标准的是让每一个维度(或属性,或列(在你的例子))具有零均值和单位方差。

这使得SVM的每个维度成相同的幅度。 从http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf :

缩放的主要优点是避免支配的那些更小的数值范围在更大的数值范围的属性。 另一个优点是在计算过程中,以避免数值diculties。 因为内核值通常依赖于特征向量的内积,例如线性内核和多项式核,大的属性值可能会导致数值问题。 我们建议线性缩放每个属性到范围[-1,+ 1]或[0,1]。



Answer 2:

我认为它归结为自己的原始数据很多。

如果你的原始数据有一些列的一些极端值,那么在我看来,在范围[-1,1]线性扩展,例如当你失去了一些定义。

比方说,你有一列,其中90%的值是100-500之间,并在剩下的10%的值低至-2000和高达+2500。

如果线性扩展这个数据,那么你就必须:

-2000 -> -1 ## <- The min in your scaled data
+2500 -> +1 ## <- The max in your scaled data

 100 -> -0.06666666666666665 
 234 -> -0.007111111111111068
 500 ->  0.11111111111111116

你可能会说什么之间原本是100和500的差别是在比较上述缩放数据来这是什么在原始数据要小。

最后,我认为这非常归结为数据的细节,我相信10%提高性能非常巧合,你肯定不会看到这种规模在您每次尝试两种方法缩放数据集的差异。

与此同时,在在对方的回答中列出的链接的文件,你可以清楚地看到,作者建议数据进行线性缩放。

我希望有人认为这有用!



文章来源: svm scaling input values