zoukankan      html  css  js  c++  java
  • SVMtrain的参数c和g的优化

    SVMtrain的参数c和g的优化

    在svm训练过程中,需要对惩罚参数c和核函数的参数g进行优化,选取最好的参数

    知道测试集标签的情况下
    是让两个参数c和g在某一范围内取离散值,然后,取测试集分类准确率最佳的参数

    不知道测试集标签的情况下

    (1)利用交叉验证的方法:(k-fold cross validation)

    1. Start 
    2. bestAccuracy = 0 
    3. bestc = 0 
    4. bestg = 0 
    5.  
    6. //n1 , n2 ,k都是事先给定的值 
    7. for c = 2^(-n1) : 2^(n1) 
    8. for g = 2^(-n2) : 2^(n2) 
    9. 将训练集平均分为k部分,设为 
    10. train(1),train(2), ... ,train(k). 
    11. 分别让每一部分作为测试集进行预测(剩下的k-1部分作为训练集对分类器进行训练)取得最后得到的所有分类的准确率的平均数,设为cv 
    12. if(cv>bestAccuracy) 
    13. bestAccuracy = cv; bestc = c; bestg = g 
    14. end 
    15. end 
    16. end 
    17. over 

    (2)leave-one-out cross validation(loo交叉验证)

    设原始数据有N个样本,那么LOO-CVj就是N-CV,即每一个样本作为验证集,其余的N-1个样本作为训练集,所以在LOO-CV下会得到N个模型,用N个模型的最终验证集的分类准确率的平均数做为在LOO-CV下分类器的性能指标

    ** 但是LOO-cv计算量太大,每个样本都要建立一个模型,计算成本太大

    当计算出所有的c和g时,这时候这些c和g有可能会出现的是:某些成对出现的c和g验证准确率一样高,这时候选择的是惩罚参数最小的c和g,认为c小的那个对象是最佳的选择

    伪代码如下
    bestAccuracy = 0
    bestc = 0
    bestg = 0
    //将c和g划分为网格进行搜索
    for c = 2 (cmin):2(cmax)
    for c = 2 (gmin):2(gmax)
    %%采用K-CV方法
    将train大致分为K组,记为train(1)train(2)…train(k)
    相应的标签也要分离出来记为train_label(1),train_label(2)…train_label(k)
    for run = 1:k
    让train(run),作为验证集,其他的作为训练集,记录此时的验证准确率为acc(run)
    end
    cv = (acc(1)+acc(2)+…acc(k))/k
    if (cv>bestAccuracy)
    bestAccury = cv;bestc=c;bestg=g;
    end
    end
    end
    over

  • 相关阅读:
    穷举法和搜索法的统计三角形
    2015.5.21 Core Java Volume 1
    我喜欢出发
    MeshLab中画面在前面加个f的代码
    【axel帮助代码】为了在单位正方形里面画一个洞 ,网上获取了此代码。
    uniapp 发起网络请求
    qt 取进程列表,读写内存, 写字节集
    qt 注册热键
    qt 获取窗口句柄的线程id和进程id GetWindowThreadProcessId
    qt 向窗口发送消息,键盘输入事件
  • 原文地址:https://www.cnblogs.com/xujianqing/p/7082470.html
Copyright © 2011-2022 走看看