% PCA主成分分析函數
% dataSet 原始數據(即需要降維的數據,n維,列爲維數)
% k 需要降到的維數
% FinalData 降維後的數據
% reconData 降維後的數據恢復得到的原始數據
%
function [ FinalData,reconData ] = PCA( dataSet, k )
[m,n] = size(dataSet); % m個n維數據
%% 去除平均值
%取平均值
dataSetMean = mean(dataSet);
%減去平均值
dataSetAdjust = zeros(m,n);
for i = 1 : m
dataSetAdjust(i , :) = dataSet(i , :) - dataSetMean;
end
%% 計算協方差矩陣
dataCov = cov(dataSetAdjust);
%% 計算協方差矩陣的特徵值D與特徵向量V
[V, D] = eig(dataCov);
% 將特徵值矩陣轉換成向量
d = zeros(1, n);
for i = 1:n
d(1,i) = D(i,i);
end
%% 對特徵值排序
[maxD, index] = sort(d);
%% 選取前k個最大的特徵值
% maxD_k = maxD(1, (n-k+1):n);
index_k = index(1, (n-k+1):n);
% 對應的特徵向量
V_k = zeros(n,k);
for i = 1:k
V_k(:,i) = V(:,index_k(1,i));
end
%% 轉換到新的空間
FinalData = dataSetAdjust*V_k;
% 在原圖中找到這些點
reconData = FinalData * V_k';
for i = 1 : m
reconData(i , :) = reconData(i , :) + dataSetMean;
end
end