sv_countのassertで死ぬ

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

コメントする