cv::SVMのsampleIdxの使い方
先日OpenCVのcv::SVMを使っていた時に、引数のsampleIdx(とvarIdx)の使い方がリファレンスに載っていなかったので、メモついでに記事にしました。
SVMとは
(略)
cv::SVMのコンストラクタもといtrainの引数について
リファレンスによると、
cv::SVM::train( const cv::Mat& trainData, const cv::Mat& responses, const cv::Mat& varIdx=cv::Mat(), const cv::Mat& sampleIdx=cv::Mat(), cv::SVMParams params=cv::SVMParams() )
- trainData:学習に用いるサンプルの特徴量。n個のdim次元の特徴量を格納したn x dim のcv::Mat
で表す。 - responses:学習に用いるサンプルのラベル。n個の-1または1の値を格納した1 x dim のcv::Mat
で表す。 - varIdx:学習に用いる特徴量のindex。trainDataの特徴量の一部の次元のみを利用して学習したいときに用いる。
- sampleIdx:学習に用いるサンプルのindex。trainDataの一部の行のみを利用して学習したいときに用いる。
- params:svmのパラメータ。詳細はリファレンス参照。
という感じです。
利用例
#include <opencv2/opencv.hpp> int main(){ cv::Mat trainData = (cv::Mat_<float>(4,2) << 1,1, 2,2, -1,-1, -2,-1); cv::Mat responses = (cv::Mat_<float>(4,1) << 1,1, -1,-1); cv::Mat sampleIdx = (cv::Mat_<int>(2,1) << 0,2); cv::SVM svm; svm.train(trainData,responses,cv::Mat(),sampleIdx); std::cout << svm.predict((cv::Mat_<float>(1,2) << 3,2)) << std::endl; }
こんな感じです。
#sampleIdxをn x 1のcv::Matを使って0,1で表現すると思って詰んだのは秘密・・・