当我手头有一个训练好的SVM模型时,如何对测试数据进行变换?我试图通过数学方程和训练好的SVM模型(使用RBF核)来模拟SVM的输出。我该怎么做呢?
在SVM中,常用的核函数包括:
这里的xi和xj代表两个样本。现在假设数据有5个样本,这种变换是否包括所有两个样本的组合来生成变换后的特征空间,比如,x1和x1,x1和x2,x1和x3,…,x4和x5,x5和x5。
如果数据有两个特征,那么二阶的多项式变换会将输入变换到3维空间,如这里的第15张幻灯片所解释的 http://www.robots.ox.ac.uk/~az/lectures/ml/lect3.pdf
现在,如何找到使用RBF核进行变换的类似解释?我正在尝试编写代码来变换测试数据,以便我可以将训练好的SVM模型应用于它。
回答:
这比那要复杂得多。简而言之——你不直接将数据映射到特征空间。你只是将点积更改为由核函数诱导的点积。当你使用多项式核时,SVM内部发生的事情是,每个点实际上(间接地)被变换到O(d^p)
维空间(其中d-输入数据维度,p-多项式核的度数)。从数学角度来看,你使用的是某种(通常未知)的投影phi_K(x)
,它具有K(x, y) = <phi_K(x), phi_K(y)>
的属性,仅此而已。在SVM实现中,你不需要实际的数据表示(因为phi_K(x)
通常非常大,有时甚至是无限的,如RBF情况),而是需要你的点与训练集中的每个元素的点积向量。
因此,你所做的(在实现中,而不是从数学角度)是提供:
- 在训练过程中提供整个Gram矩阵,
G
定义为G_ij = K(x_i, x_j)
,其中x_i
是第i个训练样本 - 在测试过程中,当你得到一个新点
y
时,你将其作为点积向量H
提供给SVM,使得H_i = K(y, x_i)
,其中x_i
再次是你的训练点(实际上你只需要支持向量的数值,但许多实现,如libsvm,实际上需要训练集大小的向量——如果你x_j
不是训练向量,你可以简单地为K(y, x_j)
填0)
请记住,这与在上述表示上训练线性SVM不同。这只是实现通常接受你的数据的方式,因为它们需要点积的定义(函数),并且传递数字通常比传递函数更容易(但有些实现,如scikit-learn的SVC模块,实际上接受函数作为核参数)。
那么RBF核是什么?它实际上是从点到以你的训练点为均值的正态分布的函数空间的映射。然后点积只是从负无穷到正无穷的两个函数乘积的积分。听起来复杂吗?乍一看是的,但这是一个非常好的技巧,值得理解!