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.cppdata.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: , , , ,

This entry was posted on 木曜日, 7 月 10th, 2008 at 11:20 and is filed under 日常. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

Leave a Reply







Message: