matlab實現主成分分析(遙感圖像處理)

數聽說明:採用的數據源是從別人那裏拷的2012年整年的Sea Surface Temperature(海標溫度,SST)數據,一直想找一份比較好的主成分分析數據,也沒找到。html

 

Matlab自身有主成分分析的函數princomp,其中返回的第二個數據就是樣本通過K-L變換後的各個成分數據,第三個參數就是特徵值大小。(第一個參數貌似是協方差矩陣,我還沒看)算法

PCA的基本原理:
  通常圖像的線性變換能夠表示爲:

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

相關文章
相關標籤/搜索