在 libsvm 中使用预先计算的内核会导致它卡住

Posted

技术标签:

【中文标题】在 libsvm 中使用预先计算的内核会导致它卡住【英文标题】:Using precomputed kernel in libsvm causes it to get stuck 【发布时间】:2012-04-11 02:11:07 【问题描述】:

我们是两个学生,想使用一类支持向量机来检测文本文档中值得总结的句子。我们已经为句子实现了句子相似度函数,我们已经将其用于另一种算法。我们现在想在 libsvm for java 中为一类 svm 使用与内核相同的函数。

我们将PRECOMPUTED 枚举用于svm_parameter(参数)中的kernel_type 字段。在svm_problem(概率)的 x 字段中,我们在表单上有核矩阵:

0:i 1:K(xi,x1) ... L:K(xi,xL) 

其中K(x,y)xy相似度的核值,L是要比较的句子数,i是当前行索引(0L )。 内核的训练 (svm.svm_train(prob, param)) 似乎有时会“陷入”看似无限循环的状态。

我们是否误解了如何使用PRECOMPUTED 枚举,还是问题出在其他地方?

【问题讨论】:

【参考方案1】:

我们解决了这个问题

事实证明,第一列中的“系列编号”需要从1L,而不是0L-1,这是我们最初的编号。我们通过检查svm.java 中的来源发现了这一点:

double kernel_function(int i, int j)

    switch(kernel_type)
    
        /* ... snip ...*/
        case svm_parameter.PRECOMPUTED:
            return x[i][(int)(x[j][0].value)].value;
        /* ... snip ...*/
    

之所以从 1 开始编号而不是 0,是因为返回值 K(i,j) 时,将行的第一列用作列索引。

示例

考虑这个 Java 矩阵:

double[][] K = new double[][] 
    double[]  1,   1.0,   0.1,   0.0,   0.2 ,
    double[]  2,   0.5,   1.0,   0.1,   0.4 ,
    double[]  3,   0.2,   0.3,   1.0,   0.7 ,
    double[]  4,   0.6,   0.5,   0.5,   1.0 
;

现在,libsvm 需要内核值 K(i,j) 来表示 i=1j=3。表达式x[i][(int)(x[j][0].value)].value 将分解为:

x[i]    -> x[1]    -> second row in K          -> [2,   0.5,   1.0,   0.1,   0.4]
x[j][0] -> x[3][0] -> fourth row, first column -> 4
x[i][(int)(x[j][0].value)].value -> x[1][4]    -> 0.4

起初这有点混乱,但更改索引解决了我们的问题。希望这可以帮助其他有类似问题的人。

【讨论】:

以上是关于在 libsvm 中使用预先计算的内核会导致它卡住的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 LibSVM 预计算内核

为啥在 matlab 中使用带有 libsvm 的预计算内核

带有预计算内核的 libsvm:如何计算分类分数?

将预计算的 chi2 内核与 libsvm (matlab) 一起使用时结果不佳

libsvm 交叉验证与 matlab 中的预计算内核

将置换后的数据放入 LibSVM 预计算内核