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