我想在我的C++源代码中直接使用LIBLINEAR(http://www.csie.ntu.edu.tw/~cjlin/liblinear)。用MATLAB / JAVA之类的语言来使用它似乎很简单,但是用C语言却很难。例如,阅读自述文件,似乎我必须将每个数据矩阵转换为特定的链表格式;从README

`x' is an array
of pointers, each of which points to a sparse representation (array
of feature_node) of one training vector.

For example, if we have the following training data:

LABEL       ATTR1   ATTR2   ATTR3   ATTR4   ATTR5
-----       -----   -----   -----   -----   -----
1           0       0.1     0.2     0       0
2           0       0.1     0.3    -1.2     0
1           0.4     0       0       0       0
2           0       0.1     0       1.4     0.5
3          -0.1    -0.2     0.1     1.1     0.1

and bias = 1, then the components of problem are:

l = 5
n = 6

y -> 1 2 1 2 3

x -> [ ] -> (2,0.1) (3,0.2) (6,1) (-1,?)
     [ ] -> (2,0.1) (3,0.3) (4,-1.2) (6,1) (-1,?)
     [ ] -> (1,0.4) (6,1) (-1,?)
     [ ] -> (2,0.1) (4,1.4) (5,0.5) (6,1) (-1,?)
     [ ] -> (1,-0.1) (2,-0.2) (3,0.1) (4,1.1) (5,0.1) (6,1) (-1,?)

因此,似乎我不能直接使用矩阵,而是必须制作一个很大的feature_node链接列表;不存在更简单的系统或任何示例我可以用更简单的方式做到这一点吗?

最佳答案

自从您发布此文档后,我不确定文档是否已更改,但是我在另一个问题[here]中使用了一种方法,在该方法中,我将问题值加载到这样的矩阵中,而不是将输入文件重写为匹配格式。 (我正在逐行解析文件并以逗号分割,然后存储在名为myData的二维数组中):

struct svm_problem prob;
struct svm_node *x_space;

prob.l = problemSize;

svm_node** x = Malloc(svm_node*, prob.l);

for (int row = 0; row < prob.l; row++)
{
    svm_node* x_space = Malloc(svm_node,4);
    for (int col = 0; col < 4; col++)
    {
        x_space[col].index = col;
        x_space[col].value = myData[row][col];
    }
    x_space[4].index = -1;
    x[row] = x_space;
}

prob.x = x;

看来效果很好,至少满足了我的需求。我不太清楚这是否可以解决您的问题(也许为时已晚)。

希望对其他人也有用。

关于regression - C\C++中的LIBLINEAR,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28240062/

10-11 05:40