主成分分析與白化預處理

上一節介紹了主成分分析應用於2維數據。現在使用高維的圖像數據來試試效果。

原始圖像如圖1所示。


圖1

每個圖片都是12*12的小patch,原始數據是一個144*10000的矩陣x

在使用了PCA旋轉之後,可以檢查一下此時的協方差矩陣是否已經成功變成對角陣了,如圖2所示。

avg=mean(x,1);
x=x-repmat(avg,size(x,1),1);
xRot = zeros(size(x)); % You need to compute this
[u,s,v]=svd(x*x'/size(x,2));
xRot=u'*x;
covar = zeros(size(x, 1)); % You need to compute this
covar=xRot*xRot'/size(xRot,2);
figure('name','Visualisation of covariance matrix');
imagesc(covar);</span>

圖2

接下來我們需要找到使得圖片方差保持在90%以上的k值。即取協方差矩陣最大的k個特徵值用來後面降維。

k = 0; % Set k accordingly
partial=0;
total=sum(diag(s));
for k=1:size(x,1)
partial=partial+s(k,k)/total;
if partial>0.9
break;
end
end</span>
這個k值是43。如果要求保持99%的樣本方差,則k取116。
確定了k值之後,就可以用PCA降維了。

xHat = zeros(size(x));
xHat=u(:,1:k)*u(:,1:k)'*x;</span>
可視化一下,可以看到用43個特徵來重構出144維圖片的效果,還是不錯的。如圖3。

圖3

而如果像前文所說,取能保持99%的k值116的話,效果會更好,如圖4。

圖4

接下來還可以進行PCA白化。

epsilon = 0.1;
xPCAWhite = zeros(size(x));
xPCAWhite=diag(1./sqrt(diag(s)+epsilon))*u'*x;</span>
然後我們驗證一下白化之後的新的協方差矩陣是否是對角陣,如圖5。
covar = zeros(size(xPCAWhite, 1)); % You need to compute this
covar=xPCAWhite*xPCAWhite'/size(xPCAWhite,2);
figure('name','Visualisation of covariance matrix');
imagesc(covar);</span>

圖5



最後是ZCA白化的處理效果,可以看出ZCA在不降維的情況下,通過變換將原始數據的邊緣提取了出來,如圖6。

xZCAWhite = zeros(size(x));
xZCAWhite=u*xPCAWhite;
figure('name','ZCA whitened images');
display_network(xZCAWhite(:,randsel));
figure('name','Raw images');
display_network(x(:,randsel));



圖6

歡迎參與討論並關注本博客微博以及知乎個人主頁後續內容繼續更新哦~

轉載請您尊重作者的勞動,完整保留上述文字以及文章鏈接,謝謝您的支持!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章