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


數據說明:采用的數據源是從別人那里拷的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM