作業中的演算法描述:
試使用matlab 中的svd 函式實現pca 演算法,即輸入資料矩陣x 和降維後的維數k,對每乙個樣本進行去中心化,然後對進行去中心化後的資料矩陣xc 用svd 函式[u,s,v] = svd(xc),輸出降維的投影矩陣ureduce(即u 的前k 列),降維後的座標表示z=ureduce』*xc。因為使用matlab中的eig也同樣能夠達到計算特徵值和特徵向量的目的,所以**中實現了兩種方法,並使用yale_face資料集作為測試。
test.m:
clear;
load('yale_face.mat');
[n, m]= size(x);
imshow(reshape(x(:,1),[64,64]),);
fori= 1:3
subplot(3,1,i)
imshow(reshape(x(:,i),[64,64]),);
end%[z1, v1]= mpca(x, 5);
% [u2_reduce, z2, v2]= mpca(x, 10);
% x_re2= u2_reduce* z2;
% for i= 1:3
% subplot(3,1,i)
% imshow(reshape(x_re2(:,i),[64,64]),);
% end
[u3_reduce, z3, v3]= mpca(x, 100);
x_re3= u3_reduce* z3;
fori= 1:3
subplot(3,1,i)
imshow(reshape(x_re3(:,i),[64,64]),);
end
演算法核心mpca.m:
function
[ u_reduce, z, v_retain ] = mpca
( x, k )
% 演算法輸入特徵x和降維後的維度k,輸入降維後的矩陣z和保留的方差比例v_retain和u_reduce
[n, m]= size(x);
% 得到均值,儲存均值影象
u= mean(x');
%imshow(reshape(u,[64,64]),);
%imwrite(uint8(reshape(u, [64,64])),'u.png');
% 去中心化
u= u'
mu= repmat(u, 1, m);
x_mu= x-mu;
%svd
tic[u1, s, v]= svd(x_mu);
toc% 得到u_reduce
u_reduce= u1(:,1:k);
% 計算保留的方差比例
d= diag(s).^2;
v_retain= sum(d(1:k))/ sum(d(1:m));
% 顯示前5個結果
fori= 1:5
subplot(k,1,i)
imshow(reshape(u_reduce(:,i),[64,64]),);
end% %eig
% sigma= (1/m)* (x_mu* x_mu');
% tic
% [u2, d]= eig(sigma);
% toc
% % u_reduce= u2(:,end- k+ 1:end);
% % d= diag(d);
% v_retain= sum(d(1:k))/ sum(d(1:m));
% % for i= 1:k
% subplot(k,1,i)
% imshow(reshape(u_reduce(:,i),[64,64]),);
% end
% 得到降維後的結果z
z= u_reduce'* x_mu;
end
值得注意的是,svd是直接使用去中心化後的矩陣的,與吳恩達課程課件不同。而eig使用的是sigma函式。 主成成份分析 PCA
在很多應用問題中向量的維度會很高,不僅給演算法帶來挑戰,而且會帶來維度災難。pca就是一種經典的無監督學習的線性降維方法。降維的出發點不是聚類,也不是分類,它只是對原始資料的一種變換,可以用更少的維度保持原始資訊最多的資訊。1.計算樣本集的均值向量,將所有的向量減去均值向量,稱為白化。2.計算樣本集...
機器學習之主成份分析PCA詳解與實踐
在pca中,資料從原來的座標系轉換到新的座標系,新座標系的選擇是由資料本身決定的。第乙個新座標軸選擇的是原始資料中方差最大的方向,第二個新座標軸選擇和第乙個座標軸正交且具有最大方差的方向。該過程一直重複,重複次數為原始資料中特徵的數目。我們會發現,大部分方差都包含在最前面的幾個新座標軸中。因此,我們...
機器學習 主成分分析
那麼更好的理解這個過程呢?我們來看一張圖 假設對於給定5個點,資料如下 要求 將這個二維的資料簡化成一維?並且損失少量的資訊 這個過程如何計算的呢?找到乙個合適的直線,通過乙個矩陣運算得出主成分分析的結果 不需要理解 pca.fit transform x x numpy array格式的資料 n ...