(轉載請註明出處:http://blog.csdn.net/zhazhiqiang/ 未經容許請勿用於商業用途)html
<5-1> 徑向基(RBF)核函數(高斯核函數) 的說明經常使用的核函數有如下4種:⑴ 線性核函數
⑵ 多項式核函數
⑶ 徑向基(RBF)核函數(高斯核函數)
⑷ Sigmoid核函數(二層神經網絡核函數)![]()
這個核函數能夠將原始空間映射到無窮維空間。對於參數σ,若是選的很大,高次特徵上的權重實際上衰減得很是快,因此實際上(數值上近似一下)至關於一個低維的子空間;反過來,若是選得很小,則能夠將任意的數據映射爲線性可分——固然,這並不必定是好事,由於隨之而來的多是很是嚴重的過擬合問題。不過,總的來講,經過調控參數,高斯覈實際上具備至關高的靈活性,也是使用最普遍的核函數之一。算法
徑向基(RBF)核函數主要肯定懲罰因子C和參數σ。其中C控制着使間隔margin最大且錯誤率最小的折中,就是在肯定的特徵空間中調節學習機器的置信範圍和經驗風險的比例;而σ2是RBF核函數參數,主要影響樣本數據在高維特徵空間中分佈的複雜程度。所以分類器的好壞取決於參數C、σ的肯定。參數選擇的好壞直接影響到分類器性能的好壞,但這方面目前缺少理論指導,沒有合適的方法,傳統的參數選取都是經過反覆的試驗,人工選取使人滿意的解。這種方法須要人的經驗指導,而且須要付出較高的時間代價。經常使用的參數選擇方法有:安全
I、網格法【OpenCV中SVM用到】網絡
選取U個C和V個σ2,就會有的組合狀態,每種組合狀態對應一種SVM分類器,經過測試對比,找出推廣識別率最高的C和σ2組合。通常取U=V=15,C取值分別爲
,
取值分別爲
共255個C、σ2組合。網格法實質上是一種窮舉法,隨着排列組合的可能狀況越多,其運算量將急劇增長。函數
II、雙線性法性能
利用RBF核SVM的性能,首先對線性SVM求解最佳參數,使之爲參數的線性SVM推廣識別率最高,稱爲;而後固定
,對知足學習
的,訓練SVM,根據對其推廣識別率的估算,獲得最優參數。雖然這種方法對σ2有很是明確的公式,但首先要求解C,而很難肯定最優的C。測試
III、梯度降低搜索法優化
設泛化偏差爲url
核函數爲,
是待定的核參數,基本過程爲:
a 將θ置一個初始值
b 用一個標準的SVM解法(如SMO),求出SVM的解——Lagrange乘子
c
![]()
d 跳轉到b直至T最小
其中是足夠小且最終收斂到零的數列。步驟c是一個標準的梯度降低算法。由分類函數公式能夠求解
,
的求解較麻煩,須要經過求解一個二次規劃問題獲得。
IV、遺傳算法
基本步驟爲:
a t=0
b 隨機選擇初始種羣P(t)
c 計算個體適應度函數值F(t)
d 若種羣中最優個體所對應的適應度函數值足夠大或者算法已經連續運行多代,且個體的最佳適應度無明顯改進則轉到第h步
e t=t+1
f 應用選擇算子法從P(t-1)中選擇P(t)
g 對P(t)進行交叉、變異操做,轉到第c步
h 給出最佳的核函數參合和懲罰因子C,並用其訓練數據集以得到全局最優分類面。
遺傳算法的缺點是收斂很慢,容易受局部極小值干擾。
<5-3>驗證核函數性能的方法(3種)(衡量泛化能力)
I、單一驗證估計
將大數量的樣本分爲兩部分:訓練樣本和測試樣本,此時測試集的錯誤率爲:
式中,p爲樣本數,爲樣本實際所屬的類別,
爲對訓練樣本預測出的類別。這種方法直觀簡單。能夠經過理論證實,當樣本數量趨近於無窮大時,該估計爲無偏估計,但現實中處理的老是數量有限的樣本問題,因此此方法的應用範圍在必定程度上受到了限制。
II、K折交叉驗證【OpenCV中SVM用到】
K折交叉驗證是一種迭代方式,一共迭代K次,每次將全部訓練樣本分爲K份相等的子集樣本,訓練樣本是選擇其中K-1份樣本,測試樣本是剩餘的一個樣本。經過K次迭代後,能夠利用平均值來評估指望泛化偏差,根據指望泛化偏差選擇一組性能最佳的參數。K折交叉驗證由K折交叉驗證偏差決定,K折交叉驗證偏差是算法錯誤率的估計,其計算方式爲:假設爲錯分類的樣本個數,通過K次迭代後,獲得
,那麼算法的錯誤率能夠近似爲錯誤分類數
和總樣本點數
之比
。該方法具備操做簡單的優勢,成爲目前應用最普遍的方法,可是這種方法容易受樣本劃分方式的影響。
III、留一法
留一法是K折交叉驗證的特例,其基本思想是當可用樣本數爲N時,訓練集由其中N-1個樣本構成,測試樣本爲剩餘的一個樣本,經N次重複,使全部的樣本都參加過測試。經過理論證實,這種估計是無偏估計。所以,從實現原理來講,留一法的效果是最佳的;可是,在參數固定的狀況下,肯定其錯誤率對樣本要訓練N-1次,運算量很大。爲了解決留一法計算量大的缺陷,目前該方法肯定核函數及其參數的經常使用方法是估計經驗風險的上界,只要上界小,分類器的推廣能力就強。
C++: CvSVMParams::CvSVMParams()
C++: CvSVMParams::CvSVMParams(int svm_type,
int kernel_type,
double degree,
double gamma,
double coef0,
double Cvalue,
double nu,
double p,
CvMat* class_weights,
CvTermCriteria term_crit
)
(3)註釋CvSVMParams::CvSVMParams() : svm_type(CvSVM::C_SVC), kernel_type(CvSVM::RBF), degree(0), gamma(1), coef0(0), C(1), nu(0), p(0), class_weights(0) { term_crit = cvTermCriteria( CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 1000, FLT_EPSILON ); }
<2>kernel_type:SVM的內核類型(4種):
C++: CvSVM::CvSVM()
C++: CvSVM::CvSVM(const Mat& trainData,
const Mat& responses,
const Mat& varIdx=Mat(),
const Mat& sampleIdx=Mat(),
CvSVMParams params=CvSVMParams()
)
C++: CvSVM::CvSVM(const CvMat* trainData,
const CvMat* responses,
const CvMat* varIdx=0,
const CvMat* sampleIdx=0,
CvSVMParams params=CvSVMParams()
)
C++: bool CvSVM::train(const Mat& trainData,
const Mat& responses,
const Mat& varIdx=Mat(),
const Mat& sampleIdx=Mat(),
CvSVMParams params=CvSVMParams()
)
C++: bool CvSVM::train(const CvMat* trainData,
const CvMat* responses,
const CvMat* varIdx=0,
const CvMat* sampleIdx=0,
CvSVMParams params=CvSVMParams()
)
C++: bool CvSVM::train_auto(const Mat& trainData,
const Mat& responses,
const Mat& varIdx,
const Mat& sampleIdx,
CvSVMParams params,
int k_fold=10,
CvParamGrid Cgrid=CvSVM::get_default_grid(CvSVM::C),
CvParamGrid gammaGrid=CvSVM::get_default_grid(CvSVM::GAMMA),
CvParamGrid pGrid=CvSVM::get_default_grid(CvSVM::P),
CvParamGrid nuGrid=CvSVM::get_default_grid(CvSVM::NU),
CvParamGrid coeffGrid=CvSVM::get_default_grid(CvSVM::COEF),
CvParamGrid degreeGrid=CvSVM::get_default_grid(CvSVM::DEGREE),
bool balanced=false
)
C++: bool CvSVM::train_auto(const CvMat* trainData,
const CvMat* responses,
const CvMat* varIdx,
const CvMat* sampleIdx,
CvSVMParams params,
int kfold=10,
CvParamGrid Cgrid=get_default_grid(CvSVM::C),
CvParamGrid gammaGrid=get_default_grid(CvSVM::GAMMA),
CvParamGrid pGrid=get_default_grid(CvSVM::P),
CvParamGrid nuGrid=get_default_grid(CvSVM::NU),
CvParamGrid coeffGrid=get_default_grid(CvSVM::COEF),
CvParamGrid degreeGrid=get_default_grid(CvSVM::DEGREE),
bool balanced=false
)
C++: float CvSVM::predict(const Mat& sample, bool returnDFVal=false ) const
C++: float CvSVM::predict(const CvMat* sample, bool returnDFVal=false ) const
C++: float CvSVM::predict(const CvMat* samples, CvMat* results) const
<3>預測函數的參數註釋
C++: int CvSVM::get_support_vector_count() const //獲取支持向量的數量
C++: const float* CvSVM::get_support_vector(int i) const //獲取支持向量
參數:i – 指定支持向量的索引。
(8)獲取所用特徵的數量的函數
<1>做用:獲取所用特徵的數量
<2>函數原型:
4、SVM處理流程總結:
a. 訓練的目的獲得參數和支持向量(存儲在xml文件中),獲得參數就能獲得支持向量,帶進算式計算SVM分類的準確度,以準確度最高的一組參數做爲最終的結果,沒有絕對線性可分的,都有一個偏差,參數就是把那個偏差降到最低。
b. 這裏的準確性是指將訓練集的每一個樣本的向量與支持向量作運算,將運算結果與標記值比較,判斷是否屬於這個類,統計這個類的正確的樣本數,最高的那一組參數準確性最高。
c. 最終訓練獲得分類器。SVM只能分兩類,因此這裏的分類器是兩個類組成一個分類器,若是有K類,就有k(k-1)/2個分類器。