Lib svm,如何将 MyModel.mat 转换为 MyModel.model

Posted

技术标签:

【中文标题】Lib svm,如何将 MyModel.mat 转换为 MyModel.model【英文标题】:Lib svm, how to convert MyModel.mat to MyModel.model 【发布时间】:2012-07-29 11:07:32 【问题描述】:

我有一个 matlab 可以轻松读取的 .mat 文件,但我需要将其转换为 C++ 可读的 .model 文件。有没有办法(手动或以编程方式)?

【问题讨论】:

【参考方案1】:

您可以在 MATLAB 中将数据矩阵加载为任何常规 MAT 文件:

load data.mat

然后使用libsvm MATLAB接口自带的MEX函数libsvmwrite,将其写入所谓的“稀疏”格式:

libsvmwrite('data.txt', label_vector, instance_matrix)

如果您谈论的是经过训练的模型而不是数据,快速搜索会发现 this page(我没有亲自测试过)。


编辑:

好的,我提到的the code 似乎需要一些调整。下面是我的修改版。我使用最新的 libSVM-3.12 进行了测试,编译器为 VS2010:

svm_savemodel.c

#include "../svm.h"
#include "mex.h"
#include "svm_model_matlab.h"

static void fake_answer(mxArray *plhs[])

    plhs[0] = mxCreateDoubleMatrix(0, 0, mxREAL);


void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

    struct svm_model *model;
    char *filename;
    const char *error_msg;
    int status;

    // check input
    if(nrhs != 2) 
        mexPrintf("Usage: svm_savemodel(model, 'filename');\n");
        fake_answer(plhs);
        return;
    
    if(!mxIsStruct(prhs[0])) 
        mexPrintf("model file should be a struct array\n");
        fake_answer(plhs);
        return;
    
    if(!mxIsChar(prhs[1]) || mxGetM(prhs[1])!=1) 
        mexPrintf("filename should be given as char(s)\n");
        fake_answer(plhs);
        return;
    

    // convert MATLAB struct to C struct
    model = matlab_matrix_to_model(prhs[0], &error_msg);
    if(model == NULL) 
        mexPrintf("Error: can't read model: %s\n", error_msg);
        fake_answer(plhs);
        return;
    

    // get filename
    filename = mxArrayToString(prhs[1]);

    // save model to file
    status = svm_save_model(filename,model);
    if (status != 0) 
        mexWarnMsgTxt("Error occured while writing to file.");
    

    // destroy model
    svm_free_and_destroy_model(&model);
    mxFree(filename);

    // return status value (0: success, -1: failure)
    plhs[0] = mxCreateDoubleScalar(status);

    return;

假设你编译了上面的 MEX 文件,下面是一个示例用法:

[labels, data] = libsvmread('./heart_scale');
model = svmtrain(labels, data, '-c 1 -g 0.07');
svm_savemodel(model, 'mymodel.model');

创建的文本文件如下所示:

mymodel.model

svm_type c_svc
kernel_type rbf
gamma 0.07
nr_class 2
total_sv 130
rho 0.426412
label 1 -1
nr_sv 63 67
SV
1 1:0.166667 2:1 3:-0.333333 4:-0.433962 5:-0.383562 6:-1 7:-1 8:0.0687023 9:-1 10:-0.903226 11:-1 12:-1 13:1 
0.6646947579781318 1:0.125 2:1 3:0.333333 4:-0.320755 5:-0.406393 6:1 7:1 8:0.0839695 9:1 10:-0.806452 12:-0.333333 13:0.5 
.
.

【讨论】:

@bluebrain:我修复了该页面上的代码。现在您可以将训练好的模型保存到文件中

以上是关于Lib svm,如何将 MyModel.mat 转换为 MyModel.model的主要内容,如果未能解决你的问题,请参考以下文章

如何进行交叉验证 SVM 分类器

SVM之SMO算法(转)

如何使用 dlib 训练或合并多个 .svm 并检测多个类

如何将多个时间序列数据呈现给 R 中的 SVM (ksvm)(或者,如何将二维输入数据呈现给 SVM)

如何将 SVM 类概率转换为 logits?

转-复现,机器学习-支持向量机(SVM)方法判断一个网页是列表页还是详情页