OpenCV中的SVM引數優化
SVM(支援向量機)是機器學習演算法裡用得最多的一種演算法。SVM最常用的是用於分類,不過SVM也可以用於迴歸,我的實驗中就是用SVM來實現SVR(支援向量迴歸)。
對於功能這麼強的演算法,opencv中自然也是有整合好了,我們可以直接呼叫。OpenCV中的SVM演算法是基於LibSVM軟體包開發的,LibSVM是臺灣大學林智仁(Lin Chih-Jen)等開發設計的一個簡單、易於使用和快速有效的SVM模式識別與迴歸的軟體包。
網上講opencv中SVM使用的文章有很多,但講SVM引數優化的文章卻很少。所以在這裡不重點講怎麼使用SVM,而是談談怎樣通過opencv中自帶的庫優化SVM中的各引數。
相信用SVM做過實驗的人都知道,SVM的各引數對實驗結果有很大的影響,比如C,gama,P,coef等等。下面就是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
)
- CvSVM::C_SVC : C類支援向量分類機。 n類分組 (n≥2),允許用異常值懲罰因子C進行不完全分類。
- CvSVM::NU_SVC : 類支援向量分類機。n類似然不完全分類的分類器。引數為取代C(其值在區間【0,1】中,nu越大,決策邊界越平滑)。
- CvSVM::ONE_CLASS : 單分類器,所有的訓練資料提取自同一個類裡,然後SVM建立了一個分界線以分割該類在特徵空間中所佔區域和其它類在特徵空間中所佔區域。
- CvSVM::EPS_SVR : 類支援向量迴歸機。訓練集中的特徵向量和擬合出來的超平面的距離需要小於p。異常值懲罰因子C被採用。
- CvSVM::NU_SVR : 類支援向量迴歸機。 代替了 p。
<2>kernel_type:SVM的核心型別(4種):
- CvSVM::LINEAR : 線性核心,沒有任何向對映至高維空間,線性區分(或迴歸)在原始特徵空間中被完成,這是最快的選擇。
- CvSVM::POLY : 多項式核心:
- CvSVM::RBF : 基於徑向的函式,對於大多數情況都是一個較好的選擇:
- CvSVM::SIGMOID : Sigmoid函式核心:
CvSVMParams param;
param.svm_type = CvSVM::EPS_SVR; //我的實驗是用SVR作迴歸分析,可能大部分人的實驗是用SVM來分類,方法都一樣
param.kernel_type = CvSVM::RBF;
param.C = 1;
param.p = 5e-3;
param.gamma = 0.01;
param.term_crit = cvTermCriteria(CV_TERMCRIT_EPS, 100, 5e-3);
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_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
)
- 前5個引數參考建構函式的引數註釋。
- k_fold: 交叉驗證引數。訓練集被分成k_fold的自子集。其中一個子集是用來測試模型,其他子集則成為訓練集。所以,SVM演算法複雜度是執行k_fold的次數。
- *Grid: (6個)對應的SVM迭代網格引數。
- balanced: 如果是true則這是一個2類分類問題。這將會建立更多的平衡交叉驗證子集。
- 這個方法根據CvSVMParams中的最佳引數C, gamma, p, nu, coef0, degree自動訓練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。
CvSVMParams param;
param.svm_type = CvSVM::EPS_SVR;
param.kernel_type = CvSVM::RBF;
param.C = 1; //給引數賦初始值
param.p = 5e-3; //給引數賦初始值
param.gamma = 0.01; //給引數賦初始值
param.term_crit = cvTermCriteria(CV_TERMCRIT_EPS, 100, 5e-3);
//對不用的引數step設為0
CvParamGrid nuGrid = CvParamGrid(1,1,0.0);
CvParamGrid coeffGrid = CvParamGrid(1,1,0.0);
CvParamGrid degreeGrid = CvParamGrid(1,1,0.0);
CvSVM regressor;
regressor.train_auto(PCA_training,tr_label,NULL,NULL,param,
10,
regressor.get_default_grid(CvSVM::C),
regressor.get_default_grid(CvSVM::GAMMA),
regressor.get_default_grid(CvSVM::P),
nuGrid,
coeffGrid,
degreeGrid);
用上面的程式碼的就可以自動訓練並優化引數。最後,若想檢視優化後的引數值,可以使用CvSVM::get_params()函式來獲得優化後的CvSVMParams。下面是示例程式碼:
CvSVMParams params_re = regressor.get_params();
regressor.save("training_srv.xml");
float C = params_re.C;
float P = params_re.p;
float gamma = params_re.gamma;
printf("\nParms: C = %f, P = %f,gamma = %f \n",C,P,gamma);
相關文章
- opencv中SVMOpenCV
- 機器學習(3),opencv4.0中SVM各個引數的意義,設定機器學習OpenCV
- opencv中svm原始碼OpenCV原始碼
- opencv中的SVM影像分類(二)OpenCV
- opencv中的SVM影像分類(一)OpenCV
- opencv SVM的使用OpenCV
- OpenCV的SVM用法OpenCV
- OpenCV 與 SVMOpenCV
- opencv SVM 使用OpenCV
- opencv + SVM 程式碼OpenCV
- opencv svm分類OpenCV
- 學習OpenCV——SVMOpenCV
- ActiveMQ 引數優化MQ優化
- opencv SVM分類DemoOpenCV
- OpenCV中的findContours函式引數詳解OpenCV函式
- 淺析MySQL語句優化中的explain引數MySql優化AI
- Myisam & InnoDB 優化引數優化
- MySQL引數配置優化MySql優化
- Oracle可變引數的優化Oracle優化
- OpenCV進階---介紹SVMOpenCV
- OpenCV中使用SVM簡介OpenCV
- Mysql優化系列(1)--Innodb重要引數優化MySql優化
- MySQL 效能優化之快取引數優化MySql優化快取
- Sklearn GridSearchCV 引數優化優化
- 命令列引數 opencv呼叫命令列OpenCV
- 【SQL優化器】初始化引數SQL優化
- 學習SVM(一) SVM模型訓練與分類的OpenCV實現模型OpenCV
- swoole優化核心引數調整優化
- Nginx實戰(六) 引數優化Nginx優化
- Linux 核心引數優化(for oracle)Linux優化Oracle
- Elasticsearch效能優化引數註解Elasticsearch優化
- spark job執行引數優化Spark優化
- Mysql 效能優化--基礎引數MySql優化
- 【SQL 效能優化】引數設定SQL優化
- weblogic幾個優化引數Web優化
- SQL Server SQL效能優化之引數化SQLServer優化
- Opencv中SVM樣本訓練、歸類流程及實現OpenCV
- OPENCV SVM介紹和自帶例子OpenCV