【问题标题】:Using precomputed kernel in libsvm causes it to get stuck在 libsvm 中使用预先计算的内核会导致它卡住
【发布时间】: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 枚举,还是问题出在其他地方?

【问题讨论】:

    标签: java kernel libsvm


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 2012-06-14
      • 2011-01-29
      • 2011-12-04
      • 2014-04-11
      • 2014-04-28
      • 2014-03-16
      • 2014-06-21
      • 2013-06-24
      • 2011-11-02
      相关资源
      最近更新 更多