SVMtrain的引數c和g的優化

2022-08-01 10:24:12 字數 1370 閱讀 3944

在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,...