C\C++ 中的 LIBLINEAR

Posted

技术标签:

【中文标题】C\\C++ 中的 LIBLINEAR【英文标题】:LIBLINEAR in C\C++C\C++ 中的 LIBLINEAR 【发布时间】:2015-03-30 04:12:04 【问题描述】:

我想在我的 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 的大链表;不存在更简单的系统或任何示例 s.t.我可以用更简单的方式做到这一点吗?

【问题讨论】:

不行,没有别的办法。如果您不想受 LIBSVM 强加的类型的限制,那么要么 (i) 不要使用 C/C++ 或 (ii) 修改源以获取您喜欢处理的对象。我不推荐选项(ii)。 【参考方案1】:

我不确定自您发布此文档以来文档是否已更改,但我使用了另一个问题 [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;

它似乎运作良好,至少满足我的需要。我不太清楚这是否能解决您的问题(也许晚了几年)。

希望对其他人也有用。

【讨论】:

【参考方案2】:

对于那些卡在这里的人,索引应该从1开始。所以应该是:

x_space[col].index = col + 1;

这是给liblinear的,我不确定libsvm是否有相同的格式。

【讨论】:

以上是关于C\C++ 中的 LIBLINEAR的主要内容,如果未能解决你的问题,请参考以下文章

为啥是 ”\?” C/C++ 中的转义序列?

C/C++ 中的类型转换到底是啥?

C/C++ 中的“@”和“$”是啥? [复制]

Ruby 代码中的 C/C++?

等效于 Julia 中的 c\c++ 编译器指令

C/C++中的类型转换