數據說明:采用的數據源是從別人那里拷的2012年全年的Sea Surface Temperature(海標溫度,SST)數據,一直想找一份比較好的主成分分析數據,也沒找到。
Matlab自身有主成分分析的函數princomp,其中返回的第二個數據就是樣本經過K-L變換后的各個成分數據,第三個參數就是特征值大小。(第一個參數貌似是協方差矩陣,我還沒看)
PCA的基本原理:
一般圖像的線性變換可以表示為:
y=Tx,
式中X為待變換圖像數據矩陣,Y為變換后的數據矩陣,T為實現這一線性變換的變換矩陣。如果變換矩陣T是正交矩陣,並且它是由原始圖像數據矩陣X的協方差矩陣S的特征向量所組成,則該線性變換成為主成分分析,並且成Y矩陣的每一行矢量為變換后的一個主成分。
具體的算法步驟為:

馬上要走了,偷個懶,直接把握之前做的一個PPT放出來了(話說也真是懶啊,這n多年沒更新一點內容能不懶嘛!!!(⊙o⊙)…)
以下為代碼實現部分:
close all;
clear all;
clc;
%% PCA_Test
path = 'data\sst\2012\';
filelist = dir('data\sst\2012\*.sst.txt');
len = length(filelist);
% savepath = 'data\sst_pic\';
figure;
% 讀取文件
for i = 1:len
filename = [path filelist(i).name];
date = filename(15:20);
sst_data(i,:) = dlmread(filename);%讀取
min_val = min(sst_data(i,:));
max_val = max(sst_data(i,:));
pic = reshape(sst_data(i,:),360,180);
pic = rot90(pic);
subplot(4,3,i),imshow(pic,[min_val max_val]),title(date);
colormap;
% % 保存數據圖像
% pic = reshape(sst_data(i,:),360,180);
% pic = rot90(pic);
% strI = int2str(i);
% save_path = [savepath strI '.tif'];
% imwrite(pic,save_path);
end
% 取得樣本數據
X = sst_data';
tempX = X;
% 取樣本大小:維度m,樣本數n
[m n] = size(X);
% 求各樣本平均值
meanVal = mean(X);
% 樣本矩陣中心化
X = X - repmat(meanVal,64800,1);
% 計算協方差
S = X' * X ./ (m - 1); %".*"表示矩陣元素對應相乘
% 計算特征值eg和特征向量Ev
[Ev eg] = eig(S);
% 由大到小排列對應
Ev = fliplr(Ev);
eg = fliplr(eg);
% % 特征向量轉置
% EvT = Ev';
% 得到新的成分
Y = tempX * Ev;
% 將各個成分進行輸出
figure;
for i = 1:n
outpic = Y(:,i);
min_num = min(outpic);
max_num = max(outpic);
outpic = reshape(outpic,360,180);
outpic = rot90(outpic);
%outtitle = ['特征值=' num2str(latent(i))];
subplot(4,3,i),imshow(outpic,[min_num max_num]),title(outtitle);%顯示,並輸出特征值
colorbar;
end
處理的結果對比顯示:

主成分結果顯示(按照特征值由大到小):

這個結果是和它內部的函數運算出來的結果是一樣的:
% PCA
[coeff score latent] = princomp(sst_data');
[m,n] = size(score);
%
figure;
for i = 1:len
outpic = score(:,i);
min_num = min(outpic);
max_num = max(outpic);
outpic = reshape(outpic,360,180);
outpic = rot90(outpic);
outtitle = ['特征值=' num2str(latent(i))];
subplot(4,3,i),imshow(outpic,[min_num max_num]),title(outtitle);%顯示,並輸出特征值
colorbar;
end
唉喲,這個博客園居然對Matlab着色顯示的時候都不怎么想要支持,看來還是我程序界都不怎么用Matlab哦
正在寫Python的實現方式,過兩天有時間了再放上來看看吧~~~
有點倉促,就此擱筆。
2016年1月11日22:38
原文鏈接:http://www.cnblogs.com/leonwen/p/5122811.html
