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に変えたら動いた….