2013-04-18 74 views
2

我有一個m * n維的矩陣MM包含n個數據,每個數據具有m維並且m非常大於n。在OpenCV中使用SVD的PCA

現在的問題是,如何計算或哪些步驟或程序找到PCA中號使用SVDOpenCV的只保留那些含有總負載或能量的99%特徵向量?

回答

4

您需要首先從數據矩陣M.您可以使用的OpenCV的calcCovarMatrix功能或簡單地計算C =(M - 畝)計算的協方差矩陣C」 X (M - mu)其中我假設你的數據樣本以M行存儲,mu是你數據樣本的平均值,A'是矩陣A轉置。接下來,對C執行SVD以獲得USU'= SVD(C),其中U'是U轉置的。在這種情況下,來自SVD的V'與U'相同,因爲C是對稱和正定的(如果C是滿秩的)或半定的(如果它是秩不足的)。 U包含C的特徵向量。你想要做的是保持k個特徵向量,即k個列(或行?你必須檢查OpenCV文檔是否返回特徵向量作爲行或列) U,其矩陣S中對應的奇異值對應於k個最大奇異值,並且其總和除以所有奇異值的總和≥0.99。基本上,這裏的奇異值對應於特徵向量中每個對應特徵的差異,並且保持頂部k保持0.99,即99%的方差/能量。

這些特徵向量組合在一起形成一個矩陣,比如英國,就是您的PCA基地。由於這些特徵向量恰好相互正交,因此Uk,Uk'的轉置就是投影矩陣。爲了得到新的測試樣本x的降維點,只需計算x_reduced = Uk'*(x-mu);

2

一般來說,對於PCA(即不是特定於OpenCV),您將從協方差矩陣開始。所以在你的情況下,輸入將是由原始樣本的組件方差形成的m*m方陣。

然後你在(非常大的)方形對稱矩陣上做一個特徵向量分解,並且可以提取你需要的最上面的特徵向量。使用相應的特徵值來確定您的百分比方差覆蓋率。

如果原始變量的比例不相似 - 即您沒有規範化數據 - 則可以使用相關矩陣而不是協方差矩陣。

對於使用OpenCV的PCA,谷歌給出some very usefule examples