OpenCV453
公開型 | 公開メンバ関数 | 公開変数類 | 全メンバ一覧

Principal Component Analysis [詳解]

#include <core.hpp>

公開型

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

公開メンバ関数

 PCA ()
 default constructor [詳解]
 
 PCA (InputArray data, InputArray mean, int flags, int maxComponents=0)
 
 PCA (InputArray data, InputArray mean, int flags, double retainedVariance)
 
PCAoperator() (InputArray data, InputArray mean, int flags, int maxComponents=0)
 performs PCA [詳解]
 
PCAoperator() (InputArray data, InputArray mean, int flags, double retainedVariance)
 
Mat project (InputArray vec) const
 Projects vector(s) to the principal component subspace. [詳解]
 
void project (InputArray vec, OutputArray result) const
 
Mat backProject (InputArray vec) const
 Reconstructs vectors from their PC projections. [詳解]
 
void backProject (InputArray vec, OutputArray result) const
 
void write (FileStorage &fs) const
 write PCA objects [詳解]
 
void read (const FileNode &fn)
 load PCA objects [詳解]
 

公開変数類

Mat eigenvectors
 eigenvectors of the covariation matrix
 
Mat eigenvalues
 eigenvalues of the covariation matrix
 
Mat mean
 mean value subtracted before the projection and added after the back projection
 

詳解

Principal Component Analysis

The class is used to calculate a special basis for a set of vectors. The basis will consist of eigenvectors of the covariance matrix calculated from the input set of vectors. The class PCA can also transform vectors to/from the new coordinate space defined by the basis. Usually, in this new coordinate system, each vector from the original set (and any linear combination of such vectors) can be quite accurately approximated by taking its first few components, corresponding to the eigenvectors of the largest eigenvalues of the covariance matrix. Geometrically it means that you calculate a projection of the vector to a subspace formed by a few eigenvectors corresponding to the dominant eigenvalues of the covariance matrix. And usually such a projection is very close to the original vector. So, you can represent the original vector from a high-dimensional space with a much shorter vector consisting of the projected vector's coordinates in the subspace. Such a transformation is also known as Karhunen-Loeve Transform, or KLT. See http://en.wikipedia.org/wiki/Principal_component_analysis

The sample below is the function that takes two matrices. The first function stores a set of vectors (a row per vector) that is used to calculate PCA. The second function stores another "test" set of vectors (a row per vector). First, these vectors are compressed with PCA, then reconstructed back, and then the reconstruction error norm is computed and printed for each vector. :

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
"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 

indicates that the input samples are stored as matrix rows

DATA_AS_COL 

indicates that the input samples are stored as matrix columns

構築子と解体子

◆ PCA() [1/3]

cv::PCA::PCA ( )

default constructor

The default constructor initializes an empty PCA structure. The other constructors initialize the structure and call PCA::operator()().

◆ PCA() [2/3]

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

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

引数
datainput samples stored as matrix rows or matrix columns.
meanoptional mean value; if the matrix is empty (noArray()), the mean is computed from the data.
flagsoperation flags; currently the parameter is only used to specify the data layout (PCA::Flags)
maxComponentsmaximum number of components that PCA should retain; by default, all the components are retained.

◆ PCA() [3/3]

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

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

引数
datainput samples stored as matrix rows or matrix columns.
meanoptional mean value; if the matrix is empty (noArray()), the mean is computed from the data.
flagsoperation flags; currently the parameter is only used to specify the data layout (PCA::Flags)
retainedVariancePercentage of variance that PCA should retain. Using this parameter will let the PCA decided how many components to retain but it will always keep at least 2.

関数詳解

◆ backProject() [1/2]

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

Reconstructs vectors from their PC projections.

The methods are inverse operations to PCA::project. They take PC coordinates of projected vectors and reconstruct the original vectors. Unless all the principal components have been retained, the reconstructed vectors are different from the originals. But typically, the difference is small if the number of components is large enough (but still much smaller than the original vector dimensionality). As a result, PCA is used.

引数
veccoordinates of the vectors in the principal component subspace, the layout and size are the same as of PCA::project output vectors.

◆ backProject() [2/2]

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

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

引数
veccoordinates of the vectors in the principal component subspace, the layout and size are the same as of PCA::project output vectors.
resultreconstructed vectors; the layout and size are the same as of PCA::project input vectors.

◆ operator()() [1/2]

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

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

引数
datainput samples stored as the matrix rows or as the matrix columns.
meanoptional mean value; if the matrix is empty (noArray()), the mean is computed from the data.
flagsoperation flags; currently the parameter is only used to specify the data layout. (PCA::Flags)
retainedVariancePercentage of variance that PCA should retain. Using this parameter will let the PCA decided how many components to retain but it will always keep at least 2.

◆ operator()() [2/2]

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

performs PCA

The operator performs PCA of the supplied dataset. It is safe to reuse the same PCA structure for multiple datasets. That is, if the structure has been previously used with another dataset, the existing internal data is reclaimed and the new eigenvalues, eigenvectors and mean are allocated and computed.

The computed eigenvalues are sorted from the largest to the smallest and the corresponding eigenvectors are stored as eigenvectors rows.

引数
datainput samples stored as the matrix rows or as the matrix columns.
meanoptional mean value; if the matrix is empty (noArray()), the mean is computed from the data.
flagsoperation flags; currently the parameter is only used to specify the data layout. (Flags)
maxComponentsmaximum number of components that PCA should retain; by default, all the components are retained.

◆ project() [1/2]

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

Projects vector(s) to the principal component subspace.

The methods project one or more vectors to the principal component subspace, where each vector projection is represented by coefficients in the principal component basis. The first form of the method returns the matrix that the second form writes to the result. So the first form can be used as a part of expression while the second form can be more efficient in a processing loop.

引数
vecinput vector(s); must have the same dimensionality and the same layout as the input data used at PCA phase, that is, if DATA_AS_ROW are specified, then vec.cols==data.cols (vector dimensionality) and vec.rows is the number of vectors to project, and the same is true for the PCA::DATA_AS_COL case.

◆ project() [2/2]

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

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

引数
vecinput vector(s); must have the same dimensionality and the same layout as the input data used at PCA phase, that is, if DATA_AS_ROW are specified, then vec.cols==data.cols (vector dimensionality) and vec.rows is the number of vectors to project, and the same is true for the PCA::DATA_AS_COL case.
resultoutput vectors; in case of PCA::DATA_AS_COL, the output matrix has as many columns as the number of input vectors, this means that result.cols==vec.cols and the number of rows match the number of principal components (for example, maxComponents parameter passed to the constructor).

◆ read()

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

load PCA objects

Loads eigenvalues eigenvectors and mean from specified FileNode

◆ write()

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

write PCA objects

Writes eigenvalues eigenvectors and mean to specified FileStorage


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