首先,内核和 SVM 的一些背景知识......
如果您想为(任何维度的)向量预先计算内核n
,需要做的是计算每对示例之间的内核函数。核函数采用两个向量并给出一个标量,因此您可以将预先计算的核视为nxn
标量矩阵。它通常称为核矩阵,有时也称为 Gram 矩阵。
有许多不同的核,最简单的是线性核(也称为点积):
sum(x_i * y_i) for i in [1..N] where (x_1,...,x_N) (y_1,..,y_N) are vectors
其次,试图回答你的问题......
关于 libsvm 中预计算内核的文档实际上非常好......
假设原始训练数据有三个四特征实例
并且测试数据有一个实例:
15 1:1 2:1 3:1 4:1
45 2:3 4:3
25 3:1
15 1:1 3:1
如果使用线性核,我们有以下
新的训练/测试集:
15 0:1 1:4 2:6 3:1
45 0:2 1:6 2:18 3:0
25 0:3 1:1 2:0 3:1
15 0:? 1:2 2:0 3:1
第二个示例中的每个向量都是内核矩阵中的一行。索引零处的值是 ID 值,它似乎只是一个顺序计数。第一个向量的索引 1 处的值是来自第一个示例的第一个向量的核函数值与自身(即(1x1)+(1x1)+(1x1)+(1x1) = 4
),第二个是第一个向量与第二个向量的核函数值(即(1x3)+(1x3)=6
)。对于示例的其余部分,它就像这样。你可以看到核矩阵是对称的,因为它应该是对称的,因为 K(x,y) = K(y,x)。
值得指出的是,第一组向量以稀疏格式表示(即缺失值为零),但核矩阵不是也不应该是稀疏的。我不知道为什么会这样,它似乎只是一个 libsvm 的东西。