gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:52:40 26 4
gpt4 key购买 nike

我们是两个想要使用一类 svm 来检测文本文档中的摘要有值(value)的句子的学生。我们已经为句子实现了句子相似度函数,我们已将其用于另一种算法。我们现在想要在 libsvm for java 中使用与内核相同的函数来实现一类 svm。

我们正在使用 PRECOMPUTED kernel_type 的枚举我们的领域 svm_parameter (参数)。在我们的 svm_problem 的 x 字段中(prob) 我们有以下形式的核矩阵:

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

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

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

最佳答案

我们解决了这个问题

事实证明,第一列中的“系列号”需要来自 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

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

关于java - 在 libsvm 中使用预先计算的内核会导致它卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9891345/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com