數聽說明:採用的數據源是從別人那裏拷的2012年整年的Sea Surface Temperature(海標溫度,SST)數據,一直想找一份比較好的主成分分析數據,也沒找到。html
Matlab自身有主成分分析的函數princomp,其中返回的第二個數據就是樣本通過K-L變換後的各個成分數據,第三個參數就是特徵值大小。(第一個參數貌似是協方差矩陣,我還沒看)算法
y=Tx,函數
式中X爲待變換圖像數據矩陣,Y爲變換後的數據矩陣,T爲實現這一線性變換的變換矩陣。若是變換矩陣T是正交矩陣,而且它是由原始圖像數據矩陣X的協方差矩陣S的特徵向量所組成,則該線性變換成爲主成分分析,而且成Y矩陣的每一行矢量爲變換後的一個主成分。spa
具體的算法步驟爲:orm
立刻要走了,偷個懶,直接把握以前作的一個PPT放出來了(話說也真是懶啊,這n多年沒更新一點內容能不懶嘛!!!(⊙o⊙)…)htm
如下爲代碼實現部分:blog
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
處理的結果對比顯示:ip
主成分結果顯示(按照特徵值由大到小):博客
這個結果是和它內部的函數運算出來的結果是同樣的:it
% 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