OpenCV 4.5.3(日本語機械翻訳)
公開型 | 公開メンバ関数 | 公開変数類 | 全メンバ一覧

Principal Component Analysis [詳解]

#include <core.hpp>

公開型

enum Flags { DATA_AS_ROW = 0 , DATA_AS_COL = 1 , USE_AVG = 2 }

公開メンバ関数

PCA ()
デフォルトコンストラクタ[【詳解】(英語]
PCA (InputArray data, InputArray mean, int flags, int maxComponents=0)
PCA (InputArray data, InputArray mean, int flags, double retainedVariance)
PCA & operator() (InputArray data, InputArray mean, int flags, int maxComponents=0)
PCAの実行[【詳解】(英語]
PCA & operator() (InputArray data, InputArray mean, int flags, double retainedVariance)
Mat project (InputArray vec) const
ベクトルを主成分部分空間に投影します.[【詳解】(英語]
void project (InputArray vec, OutputArray result) const
Mat backProject (InputArray vec) const
ベクトルをPC投影から再構成します。[【詳解】(英語]
void backProject (InputArray vec, OutputArray result) const
void write (FileStorage &fs) const
書き込みPCAオブジェクト[【詳解】(英語]
void read (const FileNode &fn)
ロードPCAオブジェクト[【詳解】(英語]

公開変数類

Mat eigenvectors
共分散行列の固有ベクトル
Mat eigenvalues
共分散行列の固有値
Mat mean
投影前に減算され,逆投影後に加算される平均値.

詳解

主成分分析

このクラスは,ベクトルの集合に対する特別な基底を計算するために使用されます.基底は,入力されたベクトルの集合から計算された共分散行列の固有ベクトルから構成されます.PCA クラスは,基底によって定義された新しい座標空間との間で,ベクトルを変換することもできます.通常,この新しい座標系では,元の集合からの各ベクトル(およびそのようなベクトルの任意の線形結合)は,共分散行列の最大の固有値の固有ベクトルに対応する最初の数個の成分を取ることによって,非常に正確に近似することができます.幾何学的には、共分散行列の支配的な固有値に対応するいくつかの固有ベクトルで形成される部分空間へのベクトルの投影を計算することを意味します。そして、通常、このような投影は、元のベクトルに非常に近いものになります。つまり、高次元空間の元のベクトルを、部分空間に投影されたベクトルの座標からなるずっと短いベクトルで表すことができるのです。このような変換は、Karhunen-Loeve変換(KLT)とも呼ばれます。参照http://en.wikipedia.org/wiki/Principal_component_analysis

下のサンプルは,2つの行列を受け取る関数です.最初の関数は,ベクトルの集合(1つのベクトルにつき1行)を格納しており,これを用いてPCA. 2 番目の関数には,別の「テスト」用のベクトルセット(1 つのベクトルにつき 1 行)が格納されています.まず,これらのベクトルは,次のように圧縮されます.PCAで圧縮され,次に再構成されます.そして,各ベクトルに対する再構成誤差ノルムが計算され,出力されます.

using namespace cv;
PCA compressPCA(const Mat& pcaset, int maxComponents,
const Mat& testset, Mat& compressed)
{
PCA pca(pcaset, // pass the data
Mat(), // we do not have a pre-computed mean vector,
// so let the PCA engine to compute it
PCA::DATA_AS_ROW, // indicate that the vectors
// are stored as matrix rows
// (use PCA::DATA_AS_COL if the vectors are
// the matrix columns)
maxComponents // specify, how many principal components to retain
);
// if there is no test data, just return the computed basis, ready-to-use
if( !testset.data )
return pca;
CV_Assert( testset.cols == pcaset.cols );
compressed.create(testset.rows, maxComponents, testset.type());
Mat reconstructed;
for( int i = 0; i < testset.rows; i++ )
{
Mat vec = testset.row(i), coeffs = compressed.row(i), reconstructed;
// compress the vector, the result will be stored
// in the i-th row of the output matrix
pca.project(vec, coeffs);
// and then reconstruct it
pca.backProject(coeffs, reconstructed);
// and measure the error
printf("%d. diff = %g\n", i, norm(vec, reconstructed, NORM_L2));
}
return pca;
}
PCA()
default constructor
@ DATA_AS_ROW
indicates that the input samples are stored as matrix rows
Definition: core.hpp:2409
CV_EXPORTS_W double norm(InputArray src1, int normType=NORM_L2, InputArray mask=noArray())
Calculates the absolute norm of an array.
@ NORM_L2
Definition: base.hpp:185
#define CV_Assert(expr)
Checks a condition at runtime and throws exception if it fails
Definition: base.hpp:342
cv
"black box" representation of the file storage associated with a file on disk.
Definition: aruco.hpp:75
参照
calcCovarMatrix,mulTransposed,SVD,dft,dct

列挙型メンバ詳解

Flags

列挙値
DATA_AS_ROW

入力サンプルが行列の行として格納されていることを示す

DATA_AS_COL

は,入力されたサンプルが行列の列として格納されていることを示します.

構築子と解体子

PCA() [1/3]

cv::PCA::PCA ( )

デフォルトコンストラクタ

デフォルトコンストラクタは,空の PCA 構造体を初期化します.他のコンストラクタは,構造体を初期化し,次のように呼び出します.PCA::operator()().

PCA() [2/3]

cv::PCA::PCA ( InputArray data,
InputArray mean,
int flags,
int maxComponents = 0
)

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

引数
data 入力サンプルが行列の行または列として格納されていることを示します.
mean オプションの平均値;行列が空(noArray())の場合は,データから平均値が計算されます.
flags 演算フラグ.現在のところ,このパラメータはデータのレイアウトを指定するためだけに利用されています(PCA::Flags)
maxComponents PCA が保持すべき成分の最大数; デフォルトでは,すべての成分が保持されます.

PCA() [3/3]

cv::PCA::PCA ( InputArray data,
InputArray mean,
int flags,
double retainedVariance
)

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

引数
data 入力サンプルが行列の行または列として格納されていることを示します.
mean オプションの平均値.行列が空の場合(noArray()),データから平均値が計算されます.
flags 演算フラグ.現在のところ,このパラメータはデータのレイアウトを指定するためだけに利用されています(PCA::Flags)
retainedVariance 保持すべき分散の割合.PCAを保持します.このパラメータを使用するとPCAが保持する成分の数を決定しますが,常に最低でも2つの成分を保持します.

関数詳解

backProject() [1/2]

Mat cv::PCA::backProject ( InputArray vec ) const

ベクトルをPC投影から再構成します。

その方法は、以下の逆演算です。PCA::project. これらのメソッドは,投影されたベクトルの PC 座標を受け取り,元のベクトルを再構成します.すべての主成分が保持されていなければ,再構成されたベクトルは元のベクトルとは異なります.しかし,一般に,成分数が十分に多ければ,その差は小さくなります(それでも,元のベクトルの次元数よりはずっと小さい).その結果PCAが使われます。

引数
vec 主成分部分空間におけるベクトルの座標は,レイアウトとサイズがPCA::project出力ベクトルです.

backProject() [2/2]

void cv::PCA::backProject ( InputArray vec,
OutputArray result
) const

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

引数
vec 主成分部分空間におけるベクトルの座標は,レイアウトとサイズがPCA::project出力ベクトルです.
result 再構成されたベクトルで,レイアウトとサイズは入力ベクトルと同じです.PCA::project入力ベクトル.

operator()() [1/2]

PCA & cv::PCA::operator() ( InputArray data,
InputArray mean,
int flags,
double retainedVariance
)

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

引数
data 行列の行または列として保存される入力サンプル.
mean オプションの平均値.行列が空の場合(noArray()),データから平均値が計算されます.
flags 操作フラグ.現在,このパラメータはデータのレイアウトを指定するためにのみ利用されます.(PCA::Flags)
retainedVariance PCAが保持すべき分散の割合.このパラメータを使用すると,PCA は保持する成分の数を決定しますが,常に最低2つの成分を保持します.

operator()() [2/2]

PCA & cv::PCA::operator() ( InputArray data,
InputArray mean,
int flags,
int maxComponents = 0
)

PCAの実行

この演算子は与えられたデータセットに対してPCAを実行します。同じ構造を複数のデータセットに再利用しても安全です。PCA構造体を複数のデータセットに再利用しても安全です。つまり,その構造体が以前に別のデータセットで使われていた場合,既存の内部データは回収され,新しいeigenvalues,eigenvectorsおよびmeanが割り当てられ,計算されます.

計算されたeigenvaluesは,大きいものから小さいものへとソートされ,対応するeigenvectorsは固有ベクトルの行として格納されます.

引数
data 行列の行または列として保存される入力サンプル.
mean オプションの平均値.行列が空の場合(noArray()),データから平均値が計算されます.
flags 操作フラグ.現在,このパラメータはデータレイアウトを指定するためにのみ使用されます.(Flags)
maxComponents を保持すべき成分の最大数.PCAデフォルトでは,すべての成分が保持されます.

project() [1/2]

Mat cv::PCA::project ( InputArray vec ) const

ベクトルを主成分部分空間に投影します.

このメソッドは、1 つ以上のベクトルを主成分部分空間に投影します。各ベクトルの投影は、主成分基底の係数で表されます。このメソッドの第 1 の形式は,第 2 の形式が結果に書き込む行列を返します.したがって,第 1 の形式は式の一部として使用でき,第 2 の形式は処理ループの中でより効率的に使用できます.

引数
vec input vector(s); PCA フェーズで使用される入力データと同じ次元,同じレイアウトでなければならない,つまり,DATA_AS_ROW が指定された場合はvec.cols==data.cols(ベクトルの次元) とvec.rowsは投影するベクトルの数であり,同様にPCA::DATA_AS_COLの場合です。

project() [2/2]

void cv::PCA::project ( InputArray vec,
OutputArray result
) const

これはオーバーロードされたメンバ関数です。利便性のために用意されています。元の関数との違いは引き数のみです。

引数
vec input vector(s); で使用した入力データと同じ次元、同じレイアウトでなければならない。PCAフェーズ、つまり DATA_AS_ROW が指定されている場合はvec.cols==data.cols(ベクトルの次元) とvec.rowsは投影するベクトルの数であり,同様にPCA::DATA_AS_COLの場合です。
result 出力ベクトル; の場合PCA::DATA_AS_COLの場合,出力行列は入力ベクトルの数と同じ数の列を持つことになります.result.cols==vec.colsとなり,行数は主成分の数と一致します(例えばmaxComponentsパラメータがコンストラクタに渡されます).

read()

void cv::PCA::read ( const FileNode & fn )

ロードPCAオブジェクト

オブジェクトをロードします.eigenvalues eigenvectorsおよびmean指定されたものからFileNode

write()

void cv::PCA::write ( FileStorage & fs ) const

書き込みPCAオブジェクト

書込みeigenvalues eigenvectorsおよびmean指定した場所にFileStorage


このクラス詳解は次のファイルから抽出されました: