zoukankan      html  css  js  c++  java
  • svm的使用

    最近在看svm,顺便做一下笔记。

    libsvm历史版本:

    https://www.csie.ntu.edu.tw/~cjlin/libsvm/oldfiles/

    关于libsvm的简介自行百度。

    我关注的是使用svm分类,opencv里面保存的模型为什么会保存多组决策函数,而直接使用libsvm找不到保存的决策函数以及每个决策函数对应的支持向量。

     libsvm中采用的是1 v 1分类。
        对于n类样本,选取其中任意2类进行训练,得到训练模型,一共 有n(n-1)/2个二分类模型,对于待预测样本,使用这n(n-1)/2个模型进行分类预测,最后对得到的结果进行统计,得到属于每一类的次数,按类别标签从小到大排列,第一个最大值所对应的类就是该次多分类预测的结果。

    svm训练:

    model = svm_train(&prob, &param);

    svm保存模型:

    svm_save_model(strResulttmp.c_str(), model)

    svm释放模型与指针:

    svm_free_and_destroy_model(&model);
    svm_destroy_param(&param);
    free(prob.y);
    free(prob.x);
    free(x_space);

    svm加载模型:

    m_SVMPredict = svm_load_model(strLoadtmp.c_str());

    svm预测分类:

    int ret = svm_predict(m_SVMPredict, svm_data);

    使用libsvm返回置信度信息:

    double *pro_estimate = new double[cls_num];
    memset(pro_estimate, 0, cls_num);
    int ret = svm_predict_probability(m_SVMPredict, svm_data, pro_estimate);

    对于需要返回置信度信息的预测,在训练时略有不同。

    svm训练默认参数(来自svm-train.c):

        // default values
        param.svm_type = C_SVC;
        param.kernel_type = RBF;
        param.degree = 3;
        param.gamma = 0;    // 1/num_features
        param.coef0 = 0;
        param.nu = 0.5;
        param.cache_size = 100;
        param.C = 1;
        param.eps = 1e-3;
        param.p = 0.1;
        param.shrinking = 1;
        param.probability = 0;
        param.nr_weight = 0;
        param.weight_label = NULL;
        param.weight = NULL;
        cross_validation = 0;

    需要返回置信度的训练时参数要改一个:

    param.probability = 1;

    一般优化参数会使用grid.py优化参数 -c 和 -g ,即

    param.C

    param.gamma

    关于提取特征后训练可以参考我的这篇博客:LIBSVM使用

  • 相关阅读:
    sqlserver2012——.Net
    sqlserver2012——逻辑运算符
    sqlserver2012——变量declare
    sqlserver2012——EXCEPT差查询
    sqlserver2012——INTERSECT交查询
    sqlserver2012——EXISTS关键字
    Vue3.0-beta
    Next
    Nuxt
    小程序相关
  • 原文地址:https://www.cnblogs.com/juluwangshier/p/13098824.html
Copyright © 2011-2022 走看看