matlab主成分分析散点图_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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值