OpenCV 4.11.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:829
Mat row(int y) const
为指定的矩阵行创建一个矩阵头。
uchar * data
指向数据的指针
定义 mat.hpp:2157
void create(int rows, int cols, int type)
根据需要分配新的数组数据。
int cols
定义 mat.hpp:2155
int rows
行和列的数量,或者当矩阵具有超过 2 维时为 (-1, -1)
定义 mat.hpp:2155
int type() const
返回矩阵元素的类型。
主成分分析。
定义 core.hpp:2498
@ DATA_AS_ROW
指示输入样本存储为矩阵行
定义 core.hpp:2500
double norm(InputArray src1, int normType=NORM_L2, InputArray mask=noArray())
计算数组的绝对范数。
@ NORM_L2
定义 base.hpp:185
#define CV_Assert(expr)
在运行时检查条件,如果失败则抛出异常。
定义 base.hpp:359
定义 core.hpp:107
另见
calcCovarMatrixmulTransposedSVDdftdct
示例
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操作标志;当前此参数仅用于指定数据布局。(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

投影前减去,投影后加上的平均值


此类的文档是从以下文件生成的