opencv中的SVM參數

原文地址:http://www.cnblogs.com/justany/archive/2012/11/23/2784125.html


設置SVM參數

struct CvSVMParams

SVM 訓練參數結構。

該結構必須被初始化後,傳給CvSVM。

CvSVMParams::CvSVMParams

構造函數

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)
參數
  • svm_type –

    指定SVM的類型,下面是可能的取值:

    • CvSVM::C_SVC C類支持向量分類機。 n類分組  (n \geq 2),允許用異常值懲罰因子C進行不完全分類。
    • CvSVM::NU_SVC \nu類支持向量分類機。n類似然不完全分類的分類器。參數爲 \nu 取代C(其值在區間【0,1】中,nu越大,決策邊界越平滑)。
    • CvSVM::ONE_CLASS 單分類器,所有的訓練數據提取自同一個類裏,然後SVM建立了一個分界線以分割該類在特徵空間中所佔區域和其它類在特徵空間中所佔區域。
    • CvSVM::EPS_SVR \epsilon類支持向量迴歸機。訓練集中的特徵向量和擬合出來的超平面的距離需要小於p。異常值懲罰因子C被採用。
    • CvSVM::NU_SVR \nu類支持向量迴歸機。 \nu 代替了 p

    可從 [LibSVM] 獲取更多細節。

  • kernel_type –

    SVM的內核類型,下面是可能的取值:

    • CvSVM::LINEAR 線性內核。沒有任何向映射至高維空間,線性區分(或迴歸)在原始特徵空間中被完成,這是最快的選擇。K(x_i, x_j) = x_i^T x_j.
    • CvSVM::POLY 多項式內核: K(x_i, x_j) = (\gamma x_i^T x_j + coef0)^{degree}, \gamma > 0.
    • CvSVM::RBF 基於徑向的函數,對於大多數情況都是一個較好的選擇: K(x_i, x_j) = e^{-\gamma ||x_i - x_j||^2}, \gamma > 0.
    • CvSVM::SIGMOID Sigmoid函數內核:K(x_i, x_j) = \tanh(\gamma x_i^T x_j + coef0).
  • degree – 內核函數(POLY)的參數degree。
  • gamma – 內核函數(POLY/ RBF/ SIGMOID)的參數\gamma
  • coef0 – 內核函數(POLY/ SIGMOID)的參數coef0
  • Cvalue – SVM類型(C_SVC/ EPS_SVR/ NU_SVR)的參數C
  • nu – SVM類型(NU_SVC/ ONE_CLASS/ NU_SVR)的參數 \nu
  • p – SVM類型(EPS_SVR)的參數 \epsilon
  • class_weights – C_SVC中的可選權重,賦給指定的類,乘以C以後變成 class\_weights_i * C。所以這些權重影響不同類別的錯誤分類懲罰項。權重越大,某一類別的誤分類數據的懲罰項就越大。
  • term_crit – SVM的迭代訓練過程的中止條件,解決部分受約束二次最優問題。您可以指定的公差和/或最大迭代次數。

默認的構造函數初始化有以下值:

複製代碼
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 );
}
複製代碼

 

OpenCV的SVM 

class CvSVM

向量支持機

CvSVM::CvSVM

訓練構造函數。

C++: CvSVM::CvSVM()
C++: CvSVM::CvSVM(const Mat& trainData, const Mat& responses, const Mat& varIdx=Mat(), const Mat& sampleIdx=Mat(), CvSVMParamsparams=CvSVMParams() )
C++: CvSVM::CvSVM(const CvMat* trainData, const CvMat* responses, const CvMat* varIdx=0, const CvMat* sampleIdx=0, CvSVMParamsparams=CvSVMParams() )
參數
  • trainData — 訓練數據,必須是CV_32FC1 (32位浮點類型,單通道)。數據必須是CV_ROW_SAMPLE的,即特徵向量以行來存儲。
  • responses — 響應數據,通常是1D向量存儲在CV_32SC1 (僅僅用在分類問題上)或者CV_32FC1格式。
  • varIdx — 指定感興趣的特徵。可以是整數(32sC1)向量,例如以0爲開始的索引,或者8位(8uC1)的使用的特徵或者樣本的掩碼。用戶也可以傳入NULL指針,用來表示訓練中使用所有變量/樣本。
  • sampleIdx — 指定感興趣的樣本。描述同上。
  • params — SVM參數。

CvSVM::train

訓練一個SVM。

C++: bool CvSVM::train(const Mat& trainData, const Mat& responses, const Mat& varIdx=Mat(), const Mat& sampleIdx=Mat(), CvSVMParamsparams=CvSVMParams() )
C++: bool CvSVM::train(const CvMat* trainData, const CvMat* responses, const CvMat* varIdx=0, const CvMat* sampleIdx=0, CvSVMParamsparams=CvSVMParams() )

參數參考構造函數。

CvSVM::train_auto

根據可選參數訓練一個SVM。

C++: bool CvSVM::train_auto(const Mat& trainData, const Mat& responses, const Mat& varIdx, const Mat& sampleIdx, CvSVMParamsparams, int k_fold=10, CvParamGrid Cgrid=CvSVM::get_default_grid(CvSVM::C), CvParamGridgammaGrid=CvSVM::get_default_grid(CvSVM::GAMMA), CvParamGrid pGrid=CvSVM::get_default_grid(CvSVM::P), CvParamGridnuGrid=CvSVM::get_default_grid(CvSVM::NU), CvParamGrid coeffGrid=CvSVM::get_default_grid(CvSVM::COEF), CvParamGriddegreeGrid=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), CvParamGridcoeffGrid=get_default_grid(CvSVM::COEF), CvParamGrid degreeGrid=get_default_grid(CvSVM::DEGREE), bool balanced=false )
參數
  • k_fold – 交叉驗證參數。訓練集被分成k_fold的自子集。其中一個子集是用來測試模型,其他子集則成爲訓練集。所以,SVM算法複雜度是執行k_fold的次數。
  • *Grid – 對應的SVM迭代網格參數。
  • balanced – 如果是true則這是一個2類分類問題。這將會創建更多的平衡交叉驗證子集。

這個方法根據CvSVMParams中的最佳參數Cgammapnucoef0degree自動訓練SVM模型。參數被認爲是最佳的交叉驗證,其測試集預估錯誤最小。

如果沒有需要優化的參數,相應的網格步驟應該被設置爲小於或等於1的值。例如,爲了避免gamma的優化,設置gamma_grid.step = 0,gamma_grid.min_val, gamma_grid.max_val 爲任意數值。所以params.gamma 由gamma得出

最後,如果參數優化是必需的,但是相應的網格卻不確定,你可能需要調用函數CvSVM::get_default_grid(),創建一個網格。例如,對於gamma,調用CvSVM::get_default_grid(CvSVM::GAMMA)。

該函數爲分類運行 (params.svm_type=CvSVM::C_SVC 或者 params.svm_type=CvSVM::NU_SVC) 和爲迴歸運行 (params.svm_type=CvSVM::EPS_SVR 或者 params.svm_type=CvSVM::NU_SVR)效果一樣好。如果params.svm_type=CvSVM::ONE_CLASS,沒有優化,並指定執行一般的SVM。

CvSVM::predict

預測樣本的相應數據。

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
參數
  • sample – 需要預測的輸入樣本。
  • samples – 需要預測的輸入樣本們。
  • returnDFVal – 指定返回值類型。如果值是true,則是一個2類分類問題,該方法返回的決策函數值是邊緣的符號距離。
  • results – 相應的樣本輸出預測的響應。

這個函數用來預測一個新樣本的響應數據(response)。在分類問題中,這個函數返回類別編號;在迴歸問題中,返回函數值。輸入的樣本必須與傳給trainData的訓練樣本同樣大小。如果訓練中使用了varIdx參數,一定記住在predict函數中使用跟訓練特徵一致的特徵。

後綴const是說預測不會影響模型的內部狀態,所以這個函數可以很安全地從不同的線程調用。

CvSVM::get_default_grid

生成一個SVM網格參數。

C++: CvParamGrid CvSVM::get_default_grid(int param_id)
參數
  • param_id –

    SVM參數的IDs必須是下列中的一個:

    • CvSVM::C
    • CvSVM::GAMMA
    • CvSVM::P
    • CvSVM::NU
    • CvSVM::COEF
    • CvSVM::DEGREE

    網格參數將根據這個ID生成。

CvSVM::get_params

返回當前SVM的參數。

C++: CvSVMParams CvSVM::get_params() const

這個函數主要是在使用CvSVM::train_auto()時去獲得最佳參數。

CvSVM::get_support_vector

檢索一定數量的支持向量和特定的向量。

C++: int CvSVM::get_support_vector_count() const
C++: const float* CvSVM::get_support_vector(int i) const
參數 i – 指定支持向量的索引。

該方法可以用於檢索一組支持向量。

CvSVM::get_var_count

返回變量的個數。

C++: int CvSVM::get_var_count() const

發佈了35 篇原創文章 · 獲贊 15 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章