OpenCV を用いた主成分分析(PCA)
ここでは PCA を OpenCV の関数を用いて行うことについてのみ説明します.PCA とは何かなどについては他のサイトや書籍を参考にされて下さい.

OpenCV には PCA を行うために次の3つの関数が用意されています.
cvCalcPCA(const CvArr* data, CvArr* avg, CvArr* eigenvalues, CvArr* eigenvectors, int flags);
1つ目の関数(cvCalcPCA)は,ベクトル集合の主成分分析を行う関数.この関数は,観測されるデータベクトル集合を
,主成分分析によって部分空間へ投影されるベクトルを
としたときの連続写像
を求めます.
cvProjectPCA(const CvArr* data, CvArr* avg, CvArr* eigenvalues, CvArr* project);
2つ目の関数(cvProjectPCA)は,指定された部分空間へベクトルを投影します.あらかじめ求めた連続写像
を用いて
から
を算出します.
cvBackProjectPCA(const CvArr* project, CvArr* avg, CvArr* eigenvectors, CvArr* result);
3つ目の関数(cvBackProjectPCA)は,投影係数から元のベクトルを再構築します.部分空間
から 観測データ空間
への逆写像
を行います.
各関数への引数については次のようになっています.
data: 入力データ(
).avg: 平均ベクトル.
eigenvalues:出力である共変動行列の固有値.
eigenvectors: 出力である共変動行列の固有ベクトル.各行が各ベクトルを意味する.
flags:操作フラグ.
CV_PCA_DATA_AS_ROW, CV_PCA_DATA_AS_COL, CV_PCA_USE_AVG
project: 分解係数の行列(
).行の数はベクトルの数と等しく,
列の数は eigenvectors の列と同じか小さくなければならない.
列の数が少ない場合,入力ベクトルは第(列数)成分までを基底とする部分空間へ写像.
result:再構築されたベクトルの行列(
).
実際のサンプルプログラムを次に用意しています.cvpca.cpp と data.txt を同一ディレクトリに保存してコンパイル,実行を行ってみて下さい.Gnuplot, OpenCV がインストールされている Linux, FreeBSD, OS X では普通に動くと思います. それ以外の環境の場合は,cvpca.cpp の40行目,plotData(result); をコメントアウトすればおそらく動くのではと思います.
プログラムは実行時に Gnuplot による出力の他,次の3つのファイルを作成します.
1.PCA_products_ファイル名
2.project_ファイル名
3.result_ファイル名
1.は 入力データの各次元の平均値,固有ベクトル,固有値を記録しています.
2.は入力データの投影した部分空間上での座標を記録しています.
3.は2.を元の空間へ再構築したものを記録しています.
サンプルプログラム:cvpca.cpp [4KB], data.txt [560KB]
フィードバックが欲しいので,何かコメントを残せていただけると幸いです.
参考文献:OpenCV リファレンス マニュアル(日本語訳)
Tags: Mac, OpenCV, PCA, 学術関連, 計算機関連
