のどあめ

ググってもなかなか出てこなかった情報を垂れ流すブログ。

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で表現すると思って詰んだのは秘密・・・