在 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)
是x
和y
相似度的核值,L
是要比较的句子数,i
是当前行索引(0
到L
)。
内核的训练 (svm.svm_train(prob, param)
) 似乎有时会“陷入”看似无限循环的状态。
我们是否误解了如何使用PRECOMPUTED
枚举,还是问题出在其他地方?
【问题讨论】:
【参考方案1】:我们解决了这个问题
事实证明,第一列中的“系列编号”需要从1
到L
,而不是0
到L-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=1
和 j=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 中使用预先计算的内核会导致它卡住的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 matlab 中使用带有 libsvm 的预计算内核