日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

SVM:從理論到OpenCV實(shí)踐

系統(tǒng) 2850 0

(轉(zhuǎn)載請(qǐng)注明出處: http://blog.csdn.net/zhazhiqiang/ ?未經(jīng)允許請(qǐng)勿用于商業(yè)用途)

?
一、理論
參考網(wǎng)友的博客:
?
總結(jié):
1、SVM是一個(gè)分類器(Classifier)?,也可以做回歸 (Regression) 。
2、 SVM的主要思想可以概括為兩點(diǎn)
(1)它是針對(duì)線性可分情況進(jìn)行分析,對(duì)于線性不可分的情況,通過使用非線性映射算法將低維輸入空間線性不可分的樣本轉(zhuǎn)化為高維特征空間使其線性可分,從而 使得高維特征空間采用線性算法對(duì)樣本的非線性特征進(jìn)行線性分析成為可能;
(2)它基于結(jié)構(gòu)風(fēng)險(xiǎn)最小化理論之上在特征空間中建構(gòu)最優(yōu)分割超平面,使得學(xué)習(xí)器得到全局最優(yōu)化,并且在整個(gè)樣本空間的期望風(fēng)險(xiǎn)以某個(gè)概率滿足一定上界。
3、 最優(yōu) 超平面 :使得每一類數(shù)據(jù)與超平面距離最近的向量與超平面之間的距離最大的這樣的平面。
4、 支持向量 :那些在間隔區(qū)邊緣的訓(xùn)練樣本點(diǎn)。
5、 核函數(shù) :SVM的關(guān)鍵在于核函數(shù)。簡(jiǎn)單說就是將低維空間線性不可分的樣本轉(zhuǎn)化為高維空間線性可分的。低維空間向量集通常難于劃分,解決的方法是將它們映射到高維空間。但這個(gè)辦法帶來的困難就是計(jì)算復(fù)雜度的增加,而核函數(shù)正好巧妙地解決了這個(gè)問題。也就是說,只要選用適當(dāng)?shù)暮撕瘮?shù),就可以得到高維空間的分類函數(shù)。在SVM理論中,采用不同的核函數(shù)將導(dǎo)致不同的SVM算法。在確定了核函數(shù)之后,由于確定核函數(shù)的已知數(shù)據(jù)也存在一定的誤差,考慮到推廣性問題,因此引入了 松弛系數(shù) 以及 懲罰系數(shù) 兩個(gè)參變量來加以校正。在確定了核函數(shù)基礎(chǔ)上,再經(jīng)過大量對(duì)比實(shí)驗(yàn)等將這兩個(gè)系數(shù)取定,該項(xiàng)研究就基本完成,適合相關(guān)學(xué)科或業(yè)務(wù)內(nèi)應(yīng)用,且有一定能力的推廣性。當(dāng)然誤差是絕對(duì)的,不同學(xué)科、不同專業(yè)的要求不一。
常用的核函數(shù)有以下4種:
線性核函數(shù)
?
多項(xiàng)式核函數(shù)
徑向基(RBF)核函數(shù)(高斯核函數(shù))
?
Sigmoid 核函數(shù)(二層神經(jīng)網(wǎng)絡(luò)核函數(shù))
<5-1> 徑向基(RBF)核函數(shù)(高斯核函數(shù))?的說明

? ? 這個(gè)核函數(shù)可以將原始空間映射到無窮維空間。對(duì)于參數(shù) σ ,如果選的很大, 高次特征上的權(quán)重實(shí)際上衰減得非常快,所以實(shí)際上(數(shù)值上近似一下)相當(dāng)于一個(gè)低維的子空間;反過來,如果 選得很小,則可以將任意的數(shù)據(jù)映射為線性可分——當(dāng)然,這并不一定是好事,因?yàn)殡S之而來的可能是非常嚴(yán)重的過擬合問題。不過,總的來說,通過調(diào)控參數(shù) ,高斯核實(shí)際上具有相當(dāng)高的靈活性,也是 使用最廣泛的核函數(shù) 之一。

<5-2> 徑向基(RBF)核函數(shù)的參數(shù)選取

? ? 徑向基( RBF )核函數(shù)主要確定 懲罰因子 C 參數(shù)σ 。其中 C 控制著使間隔 margin 最大且錯(cuò)誤率最小的折中,就是在確定的特征空間中調(diào)節(jié)學(xué)習(xí)機(jī)器的置信范圍和經(jīng)驗(yàn)風(fēng)險(xiǎn)的比例;而σ 2 RBF 核函數(shù)參數(shù),主要影響樣本數(shù)據(jù)在高維特征空間中分布的復(fù)雜程度。因此分類器的好壞取決于參數(shù) C 、σ的確定。參數(shù)選擇的好壞直接影響到分類器性能的好壞,但這方面目前缺乏理論指導(dǎo),沒有合適的方法,傳統(tǒng)的參數(shù)選取都是通過反復(fù)的試驗(yàn),人工選取令人滿意的解。這種方法需要人的經(jīng)驗(yàn)指導(dǎo),并且需要付出較高的時(shí)間代價(jià)。常用的參數(shù)選擇方法有:

I、網(wǎng)格法【OpenCV中SVM用到】

? ? 選取 U 個(gè) C V 個(gè)σ 2 ,就會(huì)有 的組合狀態(tài),每種組合狀態(tài)對(duì)應(yīng)一種 SVM 分類器,通過測(cè)試對(duì)比,找出推廣識(shí)別率最高的 C 和σ 2 組合。一般取 U=V=15 C 取值分別為 取值分別為 255 個(gè) C 、σ 2 組合。網(wǎng)格法實(shí)質(zhì)上是一種窮舉法,隨著排列組合的可能情況越多,其運(yùn)算量將急劇增加。

II、雙線性法

利用 RBF SVM 的性能,首先對(duì)線性 SVM 求解最佳參數(shù),使之為參數(shù)的線性 SVM 推廣識(shí)別率最高,稱為 ;然后固定 ,對(duì)滿足

? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

,訓(xùn)練 SVM ,根據(jù)對(duì)其推廣識(shí)別率的估算,得到最優(yōu)參數(shù)。雖然這種方法對(duì)σ 2 有非常明確的公式,但首先要求解 C ,而很難確定最優(yōu)的 C

III、梯度下降搜索法

設(shè)泛化誤差為

? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

核函數(shù)為 是待定的核參數(shù),基本過程為:

a? 將θ置一個(gè)初始值

b? 用一個(gè)標(biāo)準(zhǔn)的 SVM 解法(如 SMO ),求出 SVM 的解—— Lagrange 乘子

c? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

d? 跳轉(zhuǎn)到 b 直至 T 最小

? ? 其中 是足夠小且最終收斂到零的數(shù)列。步驟 c 是一個(gè)標(biāo)準(zhǔn)的梯度下降算法。由分類函數(shù)公式可以求解 的求解較麻煩,需要通過求解一個(gè)二次規(guī)劃問題得到。

IV、遺傳算法

基本步驟為:

?????? a t=0

?????? b? 隨機(jī)選擇初始種群 P(t)

?????? c? 計(jì)算個(gè)體適應(yīng)度函數(shù)值 F(t)

?????? d? 若種群中最優(yōu)個(gè)體所對(duì)應(yīng)的適應(yīng)度函數(shù)值足夠大或者算法已經(jīng)連續(xù)運(yùn)行多代,且個(gè)體的最佳適應(yīng)度無明顯改進(jìn)則轉(zhuǎn)到第 h

?????? e t=t+1

?????? f? 應(yīng)用選擇算子法從 P(t-1) 中選擇 P(t)

?????? g? 對(duì) P(t) 進(jìn)行交叉、變異操作,轉(zhuǎn)到第 c

?????? h? 給出最佳的核函數(shù)參合和懲罰因子 C ,并用其訓(xùn)練數(shù)據(jù)集以獲得全局最優(yōu)分類面。

??????? 遺傳算法的缺點(diǎn)是收斂很慢,容易受局部極小值干擾。

<5-3>驗(yàn)證核函數(shù)性能的方法(3種)(衡量泛化能力)

I、單一驗(yàn)證估計(jì)

? ? 將大數(shù)量的樣本分為兩部分:訓(xùn)練樣本和測(cè)試樣本,此時(shí)測(cè)試集的錯(cuò)誤率為:

? ??

式中, p 為樣本數(shù), 為樣本實(shí)際所屬的類別, 為對(duì)訓(xùn)練樣本預(yù)測(cè)出的類別。這種方法直觀簡(jiǎn)單。可以通過理論證明,當(dāng)樣本數(shù)量趨近于無窮大時(shí),該估計(jì)為無偏估計(jì),但現(xiàn)實(shí)中處理的總是數(shù)量有限的樣本問題,所以此方法的應(yīng)用范圍在一定程度上受到了限制。

II、K 折交叉驗(yàn)證 【OpenCV中SVM用到】

? ? K 折交叉驗(yàn)證是一種迭代方式,一共迭代 K 次,每次將所有訓(xùn)練樣本分為 K 份相等的子集樣本,訓(xùn)練樣本是選擇其中 K-1 份樣本,測(cè)試樣本是剩余的一個(gè)樣本。通過 K 次迭代后,可以利用平均值來評(píng)估期望泛化誤差,根據(jù)期望泛化誤差選擇一組性能最佳的參數(shù)。 K 折交叉驗(yàn)證由 K 折交叉驗(yàn)證誤差決定, K 折交叉驗(yàn)證誤差是算法錯(cuò)誤率的估計(jì),其計(jì)算方式為:假設(shè) 為錯(cuò)分類的樣本個(gè)數(shù),經(jīng)過 K 次迭代后,得到 ,那么算法的錯(cuò)誤率可以近似為錯(cuò)誤分類數(shù) 和總樣本點(diǎn)數(shù) 之比 。該方法具有操作簡(jiǎn)單的優(yōu)點(diǎn),成為 目前應(yīng)用最廣泛 的方法,但是這種方法容易受樣本劃分方式的影響。

III、留一法

???? 留一法是 K 折交叉驗(yàn)證的特例,其基本思想是當(dāng)可用樣本數(shù)為 N 時(shí),訓(xùn)練集由其中 N-1 個(gè)樣本構(gòu)成,測(cè)試樣本為剩余的一個(gè)樣本,經(jīng) N 次重復(fù),使所有的樣本都參加過測(cè)試。通過理論證明,這種估計(jì)是無偏估計(jì)。因此,從實(shí)現(xiàn)原理來說,留一法的效果是最佳的;但是,在參數(shù)固定的情況下,確定其錯(cuò)誤率對(duì)樣本要訓(xùn)練 N-1 次,運(yùn)算量很大。為了解決留一法計(jì)算量大的缺陷,目前該方法確定核函數(shù)及其參數(shù)的常用方法是估計(jì)經(jīng)驗(yàn)風(fēng)險(xiǎn)的上界,只要上界小,分類器的推廣能力就強(qiáng)。

?

二、OpenCV中SVM的參數(shù)和函數(shù)說明
1、訓(xùn)練參數(shù)結(jié)構(gòu)體? CvSVMParams (可參考 【OpenCV2.4】SVM的參數(shù)和函數(shù)介紹 )
(1)注意: 該結(jié)構(gòu)必須被初始化后,傳給CvSVM
(2)構(gòu)造函數(shù)的 原型

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)注釋
A. 默認(rèn)的構(gòu)造函數(shù)初始化有以下值:??
          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 );

}
        
      
B. 構(gòu)造函數(shù)的參數(shù)(一共10個(gè)):
<1> svm_type: 指定SVM的類型(5種):
  • CvSVM::C_SVC :? C類支持向量分類機(jī)。?n類分組??(n≥2),允許用異常值懲罰因子C進(jìn)行不完全分類。
  • CvSVM::NU_SVC :? 類支持向量分類機(jī)。n類似然不完全分類的分類器。參數(shù)為 取代C(其值在區(qū)間【0,1】中,nu越大,決策邊界越平滑)。
  • CvSVM::ONE_CLASS :? 單分類器,所有的訓(xùn)練數(shù)據(jù)提取自同一個(gè)類里,然后SVM建立了一個(gè)分界線以分割該類在特征空間中所占區(qū)域和其它類在特征空間中所占區(qū)域。
  • CvSVM::EPS_SVR :? 類支持向量回歸機(jī)。訓(xùn)練集中的特征向量和擬合出來的超平面的距離需要小于p。異常值懲罰因子C被采用。
  • CvSVM::NU_SVR :? 類支持向量回歸機(jī)。? 代替了?p。?
      

<2> kernel_type: SVM的內(nèi)核類型(4種):

  • CvSVM::LINEAR :? 線性內(nèi)核,沒有任何向映射至高維空間,線性區(qū)分(或回歸)在原始特征空間中被完成,這是最快的選擇。
? ? ? ? ? ?? .
  • CvSVM::POLY :? 多項(xiàng)式內(nèi)核:
? ? ? ? ? ? ? .
  • CvSVM::RBF :? 基于徑向的函數(shù),對(duì)于大多數(shù)情況都是一個(gè)較好的選擇:
? ? ? ? ? ? ? .
  • CvSVM::SIGMOID :? Sigmoid函數(shù)內(nèi)核:
? ? ? ? ? ?? .
<3> degree: 內(nèi)核函數(shù)(POLY)的參數(shù)degree。
<4> gamma: 內(nèi)核函數(shù)(POLY/ RBF/ SIGMOID)的參數(shù)
<5> coef0: 內(nèi)核函數(shù)(POLY/ SIGMOID)的參數(shù)coef0。
<6> Cvalue: SVM類型(C_SVC/ EPS_SVR/ NU_SVR)的參數(shù)C。
<7> nu: SVM類型(NU_SVC/ ONE_CLASS/ NU_SVR)的參數(shù)?
<8> p: SVM類型(EPS_SVR)的參數(shù)
<9> class_weights: C_SVC中的可選權(quán)重,賦給指定的類,乘以C以后變成? 。所以這些權(quán)重影響不同類別的錯(cuò)誤分類懲罰項(xiàng)。權(quán)重越大,某一類別的誤分類數(shù)據(jù)的懲罰項(xiàng)就越大。
<10> term_crit: SVM的迭代訓(xùn)練過程的中止條件,解決部分受約束二次最優(yōu)問題。您可以指定的公差和/或最大迭代次數(shù)。
?
2、支持向量機(jī) CvSVM 類(8個(gè)函數(shù))
(1)構(gòu)造函數(shù)
<1>構(gòu)造函數(shù)的 原型

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()

            ?)

<2>構(gòu)造函數(shù)的參數(shù)注釋(5個(gè))
  • trainData : ?訓(xùn)練數(shù)據(jù),必須是CV_32FC1?(32位浮點(diǎn)類型,單通道)。數(shù)據(jù)必須是CV_ROW_SAMPLE的,即特征向量以行來存儲(chǔ)。
  • responses : ?響應(yīng)數(shù)據(jù),通常是1D向量存儲(chǔ)在CV_32SC1?(僅僅用在分類問題上)或者CV_32FC1格式。
  • varIdx : ?指定感興趣的特征。可以是整數(shù)(32sC1)向量,例如以0為開始的索引,或者8位(8uC1)的使用的特征或者樣本的掩碼。用戶也可以傳入NULL指針,用來表示訓(xùn)練中使用所有變量/樣本。
  • sampleIdx : ?指定感興趣的樣本。描述同上。
  • params : ?SVM參數(shù)。
(2)訓(xùn)練函數(shù)
<1>作用:訓(xùn)練一個(gè)SVM
<2>訓(xùn)練函數(shù)的 原型

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()?

)

<3>訓(xùn)練函數(shù)的參數(shù)注釋(5個(gè))
? ? ? ? 和構(gòu)造函數(shù)的參數(shù)是一樣的,請(qǐng)參考構(gòu)造函數(shù)的參數(shù)注釋。
?
(3) 自動(dòng) 訓(xùn)練函數(shù)
<1>作用: 根據(jù)可選參數(shù)訓(xùn)練一個(gè)SVM。
<2>自動(dòng)訓(xùn)練函數(shù) 原型

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

)

<3>自動(dòng)訓(xùn)練函數(shù)的參數(shù)注釋(13個(gè))
  • 前5個(gè)參數(shù)參考 構(gòu)造函數(shù)的參數(shù)注釋。
  • k_fold:? 交叉驗(yàn)證參數(shù)。訓(xùn)練集被分成k_fold的自子集。其中一個(gè)子集是用來測(cè)試模型,其他子集則成為訓(xùn)練集。所以,SVM算法復(fù)雜度是執(zhí)行k_fold的次數(shù)。
  • *Grid:? (6個(gè)) 對(duì)應(yīng)的SVM迭代網(wǎng)格參數(shù)。
  • balanced:? 如果是true則這是一個(gè)2類分類問題。這將會(huì)創(chuàng)建更多的平衡交叉驗(yàn)證子集。
<4>自動(dòng)訓(xùn)練函數(shù)的使用說明
  • 這個(gè)方法根據(jù)CvSVMParams中的最佳參數(shù)C,?gamma,?p,?nu,?coef0,?degree自動(dòng)訓(xùn)練SVM模型。
  • 參數(shù)被認(rèn)為是最佳的交叉驗(yàn)證,其測(cè)試集預(yù)估錯(cuò)誤最小。
  • 如果沒有需要優(yōu)化的參數(shù),相應(yīng)的網(wǎng)格步驟應(yīng)該被設(shè)置為小于或等于1的值。例如,為了避免gamma的優(yōu)化,設(shè)置gamma_grid.step?=?0,gamma_grid.min_val,?gamma_grid.max_val?為任意數(shù)值。所以params.gamma?由gamma得出。
  • 最后,如果參數(shù)優(yōu)化是必需的,但是相應(yīng)的網(wǎng)格卻不確定,你可能需要調(diào)用函數(shù)CvSVM::get_default_grid(),創(chuàng)建一個(gè)網(wǎng)格。例如,對(duì)于gamma,調(diào)用CvSVM::get_default_grid(CvSVM::GAMMA)。
  • 該函數(shù)為分類運(yùn)行 (params.svm_type=CvSVM::C_SVC?或者?params.svm_type=CvSVM::NU_SVC) 和為回歸運(yùn)行 (params.svm_type=CvSVM::EPS_SVR?或者?params.svm_type=CvSVM::NU_SVR)效果一樣好。如果params.svm_type=CvSVM::ONE_CLASS,沒有優(yōu)化,并指定執(zhí)行一般的SVM。
<5> 網(wǎng)格搜索法+ K交叉驗(yàn)證
? ? 上述使用說明是OpenCV使用文檔中的,這里再加其他一些補(bǔ)充:
B、優(yōu)化參數(shù)的方式一般是用網(wǎng)格搜索法取值,然后對(duì)這組參數(shù)進(jìn)行K交叉驗(yàn)證,計(jì)算精確值(交叉驗(yàn)證的準(zhǔn)確率等于能夠被正確分類的數(shù)量百分比),尋求最優(yōu)參數(shù)。
?
(4)預(yù)測(cè)函數(shù)
<1>作用 :對(duì)輸入樣本做預(yù)測(cè)響應(yīng)。??
<2>預(yù)測(cè)函數(shù)的函數(shù) 原型

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>預(yù)測(cè)函數(shù)的參數(shù)注釋

  • sample:? 需要預(yù)測(cè)的輸入樣本。
  • samples:? 需要預(yù)測(cè)的輸入樣本們。
  • returnDFVal:? 指定返回值類型。如果值是true,則是一個(gè)2類分類問題,該方法返回的決策函數(shù)值是邊緣的符號(hào)距離。
  • results:? 相應(yīng)的樣本輸出預(yù)測(cè)的響應(yīng)。
<4>預(yù)測(cè)函數(shù)的使用說明
  • 這個(gè)函數(shù)用來預(yù)測(cè)一個(gè)新樣本的響應(yīng)數(shù)據(jù)(response)。
  • 在分類問題中,這個(gè)函數(shù)返回類別編號(hào);在回歸問題中,返回函數(shù)值。
  • 輸入的樣本必須與傳給trainData的訓(xùn)練樣本同樣大小。
  • 如果訓(xùn)練中使用了varIdx參數(shù),一定記住在predict函數(shù)中使用跟訓(xùn)練特征一致的特征。
  • 后綴const是說預(yù)測(cè)不會(huì)影響模型的內(nèi)部狀態(tài),所以這個(gè)函數(shù)可以很安全地從不同的線程調(diào)用。
(5)生成SVM網(wǎng)格參數(shù)的函數(shù)
<1>作用 : 生成一個(gè)SVM網(wǎng)格參數(shù)。?
<2>函數(shù)原型
C++:? CvParamGrid? CvSVM:: get_default_grid (int? param_id )
?
<3>函數(shù)的參數(shù)注釋
  • param_id:? SVM參數(shù)的IDs必須是下列中的一個(gè):(網(wǎng)格參數(shù)將根據(jù)這個(gè)ID生成?)
    • CvSVM::C
    • CvSVM::GAMMA
    • CvSVM::P
    • CvSVM::NU
    • CvSVM::COEF
    • CvSVM::DEGREE
<4>函數(shù)的使用說明
? ? ? ? 該函數(shù)生成一個(gè)指定的SVM網(wǎng)格參數(shù),主要用于傳遞給自動(dòng)訓(xùn)練函數(shù) CvSVM::train_auto()。
?
(6)獲取當(dāng)前SVM參數(shù)的函數(shù)
<1>作用: 獲取當(dāng)前SVM參數(shù)
<2>函數(shù)原型:
C++:? CvSVMParams ?CvSVM:: get_params() ?const
<3>函數(shù)的使用說明
? ? ? ? 這個(gè)函數(shù)主要是在使用CvSVM::train_auto()時(shí)去獲得最佳參數(shù)。
?
(7)獲取支持向量及其數(shù)量的函數(shù)
<1>作用 :獲取支持向量及其數(shù)量
<2>函數(shù)原型

C++:? int? CvSVM:: get_support_vector_count ()?const ?//獲取支持向量的數(shù)量

C++:?const? float* ?CvSVM:: get_support_vector (int? i )?const ? ?//獲取支持向量

? ? ? ? 參數(shù): i ?– 指定支持向量的索引。

?

(8)獲取所用特征的數(shù)量的函數(shù)

<1>作用 :獲取所用特征的數(shù)量

<2>函數(shù)原型:

C++:? int? CvSVM:: get_var_count ()?const
?
三、OpenCV的簡(jiǎn)單的程序例子
? ? 上述講述了處理一個(gè) 線性可分情況 的例子,包含了SVM使用的幾個(gè)步驟:
(1)準(zhǔn)備訓(xùn)練樣本及其類別標(biāo)簽( trainingDataMat,labelsMat )
(2)設(shè)置訓(xùn)練參數(shù)( CvSVMParams )
(3)對(duì)SVM進(jìn)行訓(xùn)練( CvSVM:: train )
(4)對(duì)新的輸入樣本進(jìn)行預(yù)測(cè)( CvSVM:: predict )
(5)獲取支持向量( CvSVM:: get_support_vector_count ,CvSVM:: get_support_vector ? )
?
? ? 上述講述了處理一個(gè) 線性不可分情況 的例子,著重講述了 懲罰因子C 的作用:
  • C比較大時(shí):分類錯(cuò)誤率較小,但是間隔也較小。 在這種情形下, 錯(cuò)分類對(duì)模型函數(shù)產(chǎn)生較大的影響,既然優(yōu)化的目的是為了最小化這個(gè)模型函數(shù),那么錯(cuò)分類的情形必然會(huì)受到抑制。
  • C比較小時(shí):間隔較大,但是分類錯(cuò)誤率也較大。 在這種情形下,模型函數(shù)中錯(cuò)分類之和這一項(xiàng)對(duì)優(yōu)化過程的影響變小,優(yōu)化過程將更加關(guān)注于尋找到一個(gè)能產(chǎn)生較大間隔的超平面。
? ?? 換而言之,C越大,優(yōu)化時(shí)越關(guān)注錯(cuò)分問題;C越小,越關(guān)注能否產(chǎn)生一個(gè)較大間隔的超平面。
? ? 由于樣本非線性可分, 自然就有一些被錯(cuò)分類的樣本。
?
3、多分類的簡(jiǎn)單例子 (可參考 利用SVM解決2維空間向量的3級(jí)分類問題 )
? ? 上述講述了一個(gè)三分類的例子,核函數(shù)用了RBF,并用到了其參數(shù)gamma,以及懲罰因子C,訓(xùn)練與預(yù)測(cè)和二分類一樣,只要對(duì)樣本賦予第三類的類別標(biāo)簽。
?
? ? 訓(xùn)練與預(yù)測(cè)的使用方法和上述一樣,主要看下對(duì)圖像數(shù)據(jù)的處理(簡(jiǎn)單的特征提取)。
?
? ? 訓(xùn)練與預(yù)測(cè)的使用方法還是和上述一樣,主要看下Hog特征的使用( HOGDescriptor::compute )。
?

四、SVM處理流程總結(jié):

1、 收集數(shù)據(jù) 相關(guān)性分析 (比如p卡方檢驗(yàn)), 特征選擇 (比如主成份分析PCA)。
2、歸一化數(shù)據(jù) :就是根據(jù)實(shí)際要求,將數(shù)據(jù)的取值范圍轉(zhuǎn)化為統(tǒng)一的區(qū)間如[a,b],a,b為整數(shù)。(參考 縮放訓(xùn)練和測(cè)試數(shù)據(jù)時(shí)的常見錯(cuò)誤 [附錄B])
3、分訓(xùn)練集和測(cè)試集 :利用抽樣技術(shù)將數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集。抽樣技術(shù)有分層抽樣,簡(jiǎn)單抽樣(等概率抽樣)。 一般訓(xùn)練集數(shù)量大于測(cè)試集數(shù)量 ,就是要保證足夠的訓(xùn)練樣例。
4、將數(shù)據(jù)轉(zhuǎn)化為軟件(接口)所支持的格式
5、選擇核函數(shù) ,可以優(yōu)先考慮RBF。
6、使用交叉驗(yàn)證(cross-validation)尋找最佳參數(shù)C和Υ: 對(duì)訓(xùn)練集利用交叉驗(yàn)證法選擇最好的參數(shù)C和r(西格瑪)(RBF核函數(shù)中的參數(shù)gama)。可以通過網(wǎng)格法尋找出最優(yōu)的參數(shù),注意一次交叉驗(yàn)證得到一個(gè)參數(shù)對(duì)所對(duì)應(yīng)的模型精度,網(wǎng)格法目的就是找到使得模型精度達(dá)到對(duì)高的參數(shù)對(duì)(這里的參數(shù)對(duì)可能不止兩個(gè),有可能也有其他的),可以使用一些啟發(fā)式的搜索來降低復(fù)雜度,雖然這個(gè)方法笨了點(diǎn),但是它能得到很穩(wěn)定的搜索結(jié)果。需要提到的這里在對(duì)訓(xùn)練集進(jìn)行分割的時(shí)候涉及到抽樣,一個(gè)較好的方法就是分層抽樣。從這步可以看出其實(shí) Cross-Validation是一種評(píng)估算法的方法。

? ?? a. ?訓(xùn)練的目的得到參數(shù)和支持向量(存儲(chǔ)在xml文件中),得到參數(shù)就能得到支持向量,帶進(jìn)算式計(jì)算SVM分類的準(zhǔn)確度,以準(zhǔn)確度最高的一組參數(shù)作為最終的結(jié)果,沒有絕對(duì)線性可分的,都有一個(gè)誤差,參數(shù)就是把那個(gè)誤差降到最低。

? ?? b.? 這里的準(zhǔn)確性是指將訓(xùn)練集的每個(gè)樣本的向量與支持向量做運(yùn)算,將運(yùn)算結(jié)果與標(biāo)記值比較,判斷是否屬于這個(gè)類,統(tǒng)計(jì)這個(gè)類的正確的樣本數(shù),最高的那一組參數(shù)準(zhǔn)確性最高。

? ?? c.? 最終訓(xùn)練得到分類器。SVM只能分兩類,所以這里的分類器是兩個(gè)類組成一個(gè)分類器,如果有K類,就有k(k-1)/2個(gè)分類器。

7、使用最佳參數(shù)C和Υ來訓(xùn)練整個(gè)訓(xùn)練集: 用6中得到的參數(shù)對(duì)在整個(gè)訓(xùn)練集合上進(jìn)行訓(xùn)練,從而得出模型。
8、測(cè)試: 利用測(cè)試集測(cè)試模型,得到精度。這個(gè)精度可以認(rèn)為是模型最終的精度。當(dāng)然有人會(huì)擔(dān)心3步中抽樣會(huì)有一定的誤差,導(dǎo)致8得到的精度不一定是最好的,因此可以重復(fù)3-8得到多個(gè)模型的精度,然后選擇最好的一個(gè)精度最為模型的精度(或者求所有精度的均值做為模型精度)。(需要多次選擇訓(xùn)練集和測(cè)試集,然后每一次得到一個(gè)精度的模型,選擇最好的一個(gè)精度作為模型,也就是我們項(xiàng)目里面要多次訓(xùn)練的原因)。
9. 識(shí)別分類: 兩個(gè)類超平面的形成,意味著目標(biāo)函數(shù)的形成,然后代入待識(shí)別樣本,識(shí)別時(shí)對(duì)應(yīng)的組代入對(duì)應(yīng)的參數(shù),得出結(jié)果進(jìn)行投票,判定屬于那個(gè)類。

SVM:從理論到OpenCV實(shí)踐


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 富阳市| 蓝山县| 靖远县| 广宗县| 辽宁省| 莱阳市| 兴和县| 海兴县| 永昌县| 荃湾区| 治多县| 城固县| 沙河市| 正镶白旗| 新竹市| 湖南省| 泰州市| 朔州市| 陕西省| 霍邱县| 许昌市| 辛集市| 临邑县| 云龙县| 高州市| 丰宁| 于田县| 浦北县| 龙海市| 个旧市| 当雄县| 通化县| 马公市| 县级市| 嘉义县| 普兰县| 镇远县| 调兵山市| 肥西县| 灵寿县| 台江县|