1

我正在为 MATLAB 使用 LIBSVM。现在我正在尝试计算一个点和超平面之间的距离。

根据官方解决方案(http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f4151):

“距离是

|decision_value| / |w|

我们有

|w|^2 = w^Tw = alpha^T Q alpha = 2*(dual_obj + sum alpha_i). 

因此,请在 svm.cpp 中找到我们计算对偶目标值的位置(即子程序Solve())并添加一条语句以打印w^Tw。”

但我有点困惑:“svm.cpp”中有超过 3,000 行,“我们计算双重目标的地方”在哪里?谁能告诉我怎么做???

或者有没有其他解决方案来计算与超平面的距离?

谢谢!

4

1 回答 1

0

免责声明:这不是答案。我对这个包一点也不熟悉,所以我只是猜测。我会把它放在评论中,但它不适合,所以在这里。

我认为您正在寻找的代码可能在计算目标值的 svm.cpp 的第 747 行附近。请注意,FAQ 引用了双重目标值,但“双重”一词并未出现在svm.cpp. 因此,如果我们假设该函数从一开始就设置为解决对偶问题,那么这可能会起作用:

// calculate objective value
{
    char buf[BUFSIZ];
    double sum_alpha = 0;

    double v = 0;
    int i;
    for(i=0;i<l;i++)
    {
        v += alpha[i] * (G[i] + p[i]);
        sum_alpha += alpha[i];
    }
    si->obj = v/2;

    vsprintf(buf,"Distance to hyperplane = %f",v+2*sum_alpha);
    (*svm_print_string)(buf);
}

我没有编译也没有测试过这段代码,我也不知道这是否是正确的做法,所以对整个答案持保留态度

于 2013-10-18T16:07:24.323 回答