我正在使用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
我认为可以应用两种缩放。
缩放每个实例向量,使每个向量的均值和单位方差均为零。
( (f11, f12, f13, f14) - mean((f11, f12, f13, f14) ). /std((f11, f12, f13, f14) )
将上述矩阵的每个列缩放到一个范围。例如[-1,1]
根据我对RBF内核(libSVM)的实验,我发现第二个缩放(2)将结果提高了大约10%。我不明白为什么(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%的改进性能非常巧合,您在每个数据集中尝试两种缩放方法时,您肯定不会发现这种幅度的差异上。
同时,在另一个答案中列出的链接的论文中,您可以清楚地看到作者建议数据线性缩放。
我希望有人觉得这很有用!