Fedora 20上でOpenCVをコンパイルして使っている.
cv::SVMでサポートベクトル回帰(Support Vector Regression)を使って観ようとした時にうまく行かなかったのでメモ.
#include <opencv2/opencv.hpp> int main(){ // 適当な入力データと適当なラベル cv::Mat_<float> x(100,2,CV_32FC1); cv::Mat_<float> l(100,1); for(int i=50;i<100;i++) l(i,0)=1; // SVRのパラメータ CvSVMParams params; CvTermCriteria criteria; criteria=cv::TermCriteria(CV_TERMCRIT_EPS,1000,FLT_EPSILON); // ここで第1引数を CvSVM::EPS_SVR にすると SVMではなく SVR になる params=CvSVMParams(CvSVM::EPS_SVR,CvSVM::RBF,10.0,8.0,1.0,10.0,0.5,0.1,NULL,criteria); cv::SVM svm; // 学習の実行 svm.train_auto(x,l,cv::Mat(),cv::Mat(),params); return 0; }
SVRはこういう感じで使える.
SVMの種類はC_SVRとNU_SVRがあるが,とりあえずC_SVRを使う.
パラメータの設定は結構重要だが,クロスバリデーションによって自動で良いパラメータを探索してくれる.
このtrain_autoを実行しようとした時,アサーションエラーで死ぬようになった.
問題の箇所は sv_count != 0 のアサート.
多分サポートベクトルの数が0ならダメっていうことなんだろう.
普通のtrainなら上手くいくし,学習サンプル変えたりしながら色々試したけど原因わからず….
SVRの種類をNU_SVRに変えたら動いた….