Matlab 中高維數組怎麼做 PCA?

最近做一個關於PCA降維圖像的一個實驗,使用的是普通PC機。由於內存有限,按照普通的做法無法直接計算高維圖像,例如512*512的PCA。請教大家一下,大家的實戰經驗是怎樣的?謝謝大家了,祝大家新的一年買彩票就中獎,買股票就漲。。。


其實有一個很小的trick解決這個問題。可以讓矩陣的維度大大降低。
假設x為m*n的matrix, m &>&> n
S = x*x", PCA需要計算S最大的k個特徵值以及對應的特徵向量。但是m*m維度太大,無法直接求解。
Let C = x『*x, Cv = av, a 為eigenvalue,v為eigenvector,then x*Cv=x*x"*xv = ax*v, ie, S*(xv) = a*(xv)
所以假設(a v)是C的eigenvalue and eigenvector,那麼(a, xv) 是S的eigenvalue and eigenvector
樓主例子中m = 262144,假設你有1000張圖片,n = 1000,那麼最多只需要計算一個1000*1000的矩陣的eigenvalue and eigenvector,計算量不知小到哪裡去了。


我理解樓主,之前我自己實現pca演算法時,也是有同樣的問題。

然後我就用matlab提供的SVD分解去做了~


@清風 講的kernel trick,常用於p&>&>n情況下的lasso, ridge,SVM等。
如果只做PCA的話,如果你有compact SVD的subroutine(MATLAB就是svd(x,0)),這個辦法和kernel trick的運算量是相當的。都是O(pn^2)+O(n^3)。

X=rand(1000,512*512);
tic; [U,S,V] = svd(X,0);toc
Elapsed time is 47.183971 seconds.
&>&> X=rand(1000,256*256);
tic; [U,S,V] = svd(X,0);toc
Elapsed time is 11.436737 seconds.

當然,理解kernel trick是大有用處的,比如從PCA到kernel PCA就很自然了。


用SVD或者PRINCOMP函數,具體兩個函數的用法,輸出,選取多少個主成分,你需要搞懂主成分分析的原理。主成分分析 - Ufldl這個網站講解的很清楚。


PCA可以用SVD做啊。
一個小小的疑問:
直接對512×512做PCA,這樣結果有用么?????


用2dpca做吧,效果也不錯
為了降維,可以試一試(2D)2 PCA 就是two-direction two-dimensional pca


pca可以用svd做,在matlab的文檔里有一個」經濟「選項,就是你需要多少個 主成份 你就計算多少個eigen vector。


[COEFF, SCORE, LATENT] = PRINCOMP(X)

LATENT協方差矩陣的特徵值。
SCORE是對主分的打分,也就是說原X矩陣在主成分空間的表示。
COEFF是X矩陣所對應的協方差陣V的所有特徵向量組成的矩陣,即變換矩陣或稱投影矩陣。
用你的原矩陣x*coeff(:,1:n)才是你要的的新數據,其中的n是你想降到多少維。

以上答案摘自百度,這種問題其實百度一下就好了。


推薦閱讀:

谷歌智能車的難點在哪裡?模式識別,還是分析、控制演算法?

TAG:圖像處理 | 機器學習 | 模式識別 | 無監督學習 | 深度學習(Deep Learning) |