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

投影前減去並在反投影后新增的平均值


該類的文件生成自以下檔案