svm缩放输入值

时间:2013-03-15 15:36:59

标签: machine-learning computer-vision svm libsvm

我正在使用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]

  3. 根据我对RBF内核(libSVM)的实验,我发现第二个缩放(2)将结果提高了大约10%。我不明白为什么(2)给我一个改进的结果。

    有人可以解释一下我应用缩放的原因是什么,为什么第二种选择可以改善结果呢?

2 个答案:

答案 0 :(得分:19)

要做的标准事情是使每个维度(或属性或列(在您的示例中))具有零均值和单位方差。

这使SVM的每个维度达到相同的大小。来自http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

  

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

答案 1 :(得分:3)

我相信它归结为您的原始数据。

如果您的原始数据对某些列具有某些极值,那么在我看来,在线性缩放时会丢失一些定义,例如在[-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%的改进性能非常巧合,您在每个数据集中尝试两种缩放方法时,您肯定不会发现这种幅度的差异上。

同时,在另一个答案中列出的链接的论文中,您可以清楚地看到作者建议数据线性缩放。

我希望有人觉得这很有用!