OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
cv::PCA 类参考

主成分分析。 更多...

#include <opencv2/core.hpp>

cv::PCA 协作图

公共类型

枚举  标志 {
  DATA_AS_ROW = 0 ,
  DATA_AS_COL = 1 ,
  USE_AVG = 2
}
 

公共成员函数

 PCA ()
 默认构造函数
 
 PCA (InputArray data, InputArray mean, int flags, double retainedVariance)
 
 PCA (InputArray data, InputArray mean, int flags, int maxComponents=0)
 
Mat backProject (InputArray vec) const
 从其 PC 投影中重建向量。
 
void backProject (InputArray vec, OutputArray result) const
 
PCAoperator() (InputArray data, InputArray mean, int flags, double retainedVariance)
 
PCAoperator() (InputArray data, InputArray mean, int flags, int maxComponents=0)
 执行 PCA
 
Mat project (InputArray vec) const
 将向量投影到主成分子空间。
 
void project (InputArray vec, OutputArray result) const
 
void read (const FileNode &fn)
 加载 PCA 对象
 
void write (FileStorage &fs) const
 写入 PCA 对象
 

公共属性

Mat eigenvalues (特征值)
 协方差矩阵的特征值
 
Mat eigenvectors (特征向量)
 协方差矩阵的特征向量
 
Mat mean
 投影前减去并在反投影后添加的平均值
 

详细描述

主成分分析。

该类用于计算一组向量的特殊基。该基将由从输入向量集计算出的协方差矩阵的特征向量组成。PCA 类还可以将向量转换到/从由该基定义的新坐标空间。通常,在这个新坐标系中,原始集中的每个向量(以及这些向量的任何线性组合)可以通过取其前几个分量(对应于协方差矩阵最大特征值的特征向量)来相当准确地近似。几何上,这意味着您将向量投影到由协方差矩阵的主导特征值对应的几个特征向量形成的子空间。通常,这种投影非常接近原始向量。因此,您可以使用一个由投影向量在子空间中的坐标组成的短得多的向量来表示高维空间中的原始向量。这种变换也称为 Karhunen-Loeve 变换(或 KLT)。请参阅 http://en.wikipedia.org/wiki/Principal_component_analysis

下面的示例是一个接受两个矩阵的函数。第一个函数存储一组向量(每行一个向量),用于计算 PCA。第二个函数存储另一组“测试”向量(每行一个向量)。首先,这些向量通过 PCA 进行压缩,然后重建,接着计算并打印每个向量的重建误差范数。

using namespace cv;
PCA compressPCA(const Mat& pcaset, int maxComponents,
const Mat& testset, Mat& compressed)
{
PCA pca(pcaset, // 传入数据
Mat(), // 我们没有预先计算好的均值向量,
// 所以让 PCA 引擎来计算它
PCA::DATA_AS_ROW, // 指示向量
// 以矩阵行的形式存储
// (如果向量是矩阵列,则使用 PCA::DATA_AS_COL)
// 矩阵列)
maxComponents // 指定保留多少主成分
);
// 如果没有测试数据,只需返回计算好的基础,即可使用
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;
// 压缩向量,结果将存储
// 在输出矩阵的第 i 行
pca.project(vec, coeffs);
// 然后重建它
pca.backProject(coeffs, reconstructed);
// 并测量误差
printf("%d. diff = %g\n", i, norm(vec, reconstructed, NORM_L2));
}
return pca;
}
n 维密集数组类
定义 mat.hpp:830
Mat row(int y) const
为指定的矩阵行创建矩阵头。
uchar * data
指向数据的指针
定义 mat.hpp:2167
void create(int rows, int cols, int type)
如果需要,分配新的数组数据。
int cols
定义 mat.hpp:2165
int rows
矩阵的行数和列数,或 (-1, -1) 当矩阵超过 2 维时
定义 mat.hpp:2165
int type() const
返回矩阵元素的类型。
主成分分析。
定义 core.hpp:2503
@ DATA_AS_ROW
表示输入样本以矩阵行的形式存储
定义 core.hpp:2505
double norm(InputArray src1, int normType=NORM_L2, InputArray mask=noArray())
计算数组的绝对范数。
@ NORM_L2
定义 base.hpp:185
#define CV_Assert(expr)
在运行时检查条件,如果失败则抛出异常。
定义 base.hpp:423
定义 core.hpp:107
另请参见
calcCovarMatrix, mulTransposed, SVD, dft, dct
示例
samples/cpp/pca.cppsamples/cpp/tutorial_code/ml/introduction_to_pca/introduction_to_pca.cpp

成员枚举文档

◆ 标志

枚举器
DATA_AS_ROW 

表示输入样本以矩阵行的形式存储

DATA_AS_COL 

表示输入样本以矩阵列的形式存储

USE_AVG 

构造函数 & 析构函数文档

◆ 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
maxComponentsPCA 应保留的最大分量数;默认情况下,保留所有分量。

◆ PCA() [3/3]

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

这是一个重载成员函数,为了方便而提供。它与上述函数的区别仅在于它接受的参数。

参数
data输入样本以矩阵行或矩阵列的形式存储。
mean可选的平均值;如果矩阵为空(noArray()),则平均值将从数据中计算。
flags操作标志;目前该参数仅用于指定数据布局(PCA::Flags
retainedVariancePCA 应保留的方差百分比。使用此参数将允许 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
retainedVariancePCA 应保留的方差百分比。使用此参数将允许 PCA 决定保留多少分量,但它始终至少保留 2 个。

◆ operator()() [2/2]

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

执行 PCA

该运算符对提供的数据集执行 PCA。重用相同的 PCA 结构处理多个数据集是安全的。也就是说,如果该结构之前已用于另一个数据集,则现有内部数据将被回收,并分配和计算新的 特征值特征向量均值

计算出的特征值按从大到小排序,相应的特征向量以特征向量行的形式存储。

参数
data输入样本以矩阵行或矩阵列的形式存储。
mean可选的平均值;如果矩阵为空(noArray()),则平均值将从数据中计算。
flags操作标志;目前该参数仅用于指定数据布局。(标志)
maxComponentsPCA 应保留的最大分量数;默认情况下,保留所有分量。

◆ project() [1/2]

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

将向量投影到主成分子空间。

这些方法将一个或多个向量投影到主成分子空间,其中每个向量投影都由主成分基中的系数表示。第一种形式的方法返回第二种形式写入结果的矩阵。因此,第一种形式可以用作表达式的一部分,而第二种形式在处理循环中可能更高效。

参数
vec输入向量;必须具有与 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输入向量;必须具有与 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 对象

从指定的 FileNode 加载 特征值 特征向量均值

◆ write()

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

写入 PCA 对象

特征值 特征向量均值写入指定的 FileStorage

成员数据文档

◆ eigenvalues

Mat cv::PCA::eigenvalues

协方差矩阵的特征值

◆ eigenvectors

Mat cv::PCA::eigenvectors

协方差矩阵的特征向量

◆ mean

Mat cv::PCA::mean

投影前减去并在反投影后添加的平均值


该类的文档生成自以下文件