在svm訓練過程中,需要對懲罰引數c和核函式的引數g進行優化,選取最好的引數
知道測試集標籤的情況下
是讓兩個引數c和g在某一範圍內取離散值,然後,取測試集分類準確率最佳的引數
不知道測試集標籤的情況下
start
bestaccuracy = 0
bestc = 0
bestg = 0
//n1 , n2 ,k都是事先給定的值
for c = 2^(-n1) : 2^(n1)
for g = 2^(-n2) : 2^(n2)
將訓練集平均分為k部分,設為
train(1),train(2), ... ,train(k).
分別讓每一部分作為測試集進行**(剩下的k-1部分作為訓練集對分類器進行訓練)取得最後得到的所有分類的準確率的平均數,設為cv
if(cv>bestaccuracy)
bestaccuracy = cv; bestc = c; bestg = g
end
end
end
over
設原始資料有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)
endcv = (acc(1)+acc(2)+…acc(k))/k
if (cv>bestaccuracy)
bestaccury = cv;bestc=c;bestg=g;
endend
endover
svmtrain的返回引數
parameters 乙個5 x 1的矩陣,從上到下依次表示 s svm型別 預設0 t 核函式型別 預設2 d 核函式中的degree設定 針對多項式核函式 預設3 g 核函式中的r gamma 函式設定 針對多項式 rbf sigmoid核函式 預設類別數目的倒數 r 核函式中的coef0設定 ...
svmtrain返回值的引數解釋
parameters 5x1 double 結構體變數,依次儲存的是 s t d g r等引數 nr class 1025 分類的個數 totalsv 3015 總的支援向量個數 rho 5151x1 double b model.rho label 102x1 double proba probb...
c 中的巨集定義 g 中引數
如果定義debug時才能出現的函式呼叫,那麼就可以這樣寫 ifdef debug define debug x endif ifdef release define debug x endif 使用就可以直接使用debug abc 然後在g 或者gcc編譯時使用 g def.cpp d deubg,...