MATLAB线性回归

1.regress函数

线性回归其实就是通过拟合的方法求出离散点的一元线性方程,大多数采用的是最小二乘方法。最后能求出 matlab regress用法 matlab中regress函数用法_数据
matlab regress用法 matlab中regress函数用法_matlab regress用法_02 matlab regress用法 matlab中regress函数用法_拟合_03
  这里直接用最为常见的5个参数的regress 其中b是一个一行两列的向量,第一个返回的是常数项,第二个返回的是 matlab regress用法 matlab中regress函数用法_数据_04matlab regress用法 matlab中regress函数用法_matlab regress用法_05 由4个数构成,第一个是 matlab regress用法 matlab中regress函数用法_线性回归_06,用来表示这个回归模型是否良好,第二个数是 matlab regress用法 matlab中regress函数用法_数据_07 分布自由度对应的 matlab regress用法 matlab中regress函数用法_数据_07 值,主要用来做 matlab regress用法 matlab中regress函数用法_数据_07 检验用,通过这个值大于自由度下的 matlab regress用法 matlab中regress函数用法_拟合_10以及 matlab regress用法 matlab中regress函数用法_matlab_11进行比较做F检验,如果利用第三个参数 matlab regress用法 matlab中regress函数用法_matlab regress用法_12 值来做检验,如果 matlab regress用法 matlab中regress函数用法_拟合_13 表示回归的比较显著。如果matlab regress用法 matlab中regress函数用法_matlab_14则非常显著。
  例如下面的c是10年的VFC植被覆盖度,x为年份,建议用1-n年份,这样回归后的系数会比较大一定
  实际上,就是一个假设检验的问题,我做一个 matlab regress用法 matlab中regress函数用法_数据_15 的假设和一个 matlab regress用法 matlab中regress函数用法_拟合_16 的备择假设,而 matlab regress用法 matlab中regress函数用法_数据_07 分布是在 matlab regress用法 matlab中regress函数用法_数据_18

c = [0.729587018	0.7546345	0.718326032	0.725992024	0.579145432	0.741261721	0.674983203	0.649813294	0.442957938	0.716242433]';  
x = linspace(1,10,10)';	
X = [ones(size(c)),x]; 							
[b,bint,r,rint,stats] = regress(c,X);              
b1 = [b(2),b(1)];										
k = num2str(b1(1));
pianyi = num2str(b1(2));
y1 = polyval(b1,x1);
plot(x1,c','r*','markersize',8);
R2 = num2str(stats(1));
box off;                                           %只显示两条坐标轴
hold on;
plot(x1,y1,'b-');                                   
text(5,0.6,['y =',k,'x','+',pianyi],'Interpreter','latex','fontsize',12);
str = ['$R^2$ = ',R2];                                                                   
text(2010,0.87,str,'Interpreter','latex','fontsize',12);			%LaTeX的解释器
title('平度站点VFC10年线性回归的结果','fontsize',20,'fontname','楷体');	
xlabel('年份','fontsize',15);
ylabel('VFC','fontsize',15);
set(gca,'XTickLabel',...
    {'2009','2010','2011','2012','2013','2014','2015','2016','2017','2018'});

比如上面这段代码利用线性回归求平度站点10年来的回归系数,需要注意的是,在用regress的时候你需要在前面加入ones(size())用来产生常数,同时b返回的顺序也需要注意,这段代码主要是用来做线性回归并且再作图的。

matlab regress用法 matlab中regress函数用法_线性回归_19


做完图的效果如上。也可以看到其实一元线性回归的样子其实不是特别好,毕竟是特别简单的函数式来拟合不是特别理想

2.Geotiffread && 等等

[a,R] = geotiffread('回归后的图.tif');
info = geotiffinfo('回归后的图.tif');
geotiffwrite('test.tif',a,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);

这三句话是之后要用的核心,对于遥感数据或者地学数据来说也是核心,其中[a,R]中的a是图像的矩阵,R是一些地理框架,而info返回的是地理信息。。

matlab regress用法 matlab中regress函数用法_拟合_20


info是一个结构体,R是特定的数据类型

matlab regress用法 matlab中regress函数用法_数据_21


这个是R数据的截图,里面有各种各样的参数,可以忽略之。

matlab regress用法 matlab中regress函数用法_线性回归_22


这个是info里面的信息,里面有我们经常用到的包括投影信息等等。其中这个GeoTIFFTags非常的重要,对于想要写出包含地理信息的图像的话必须要加上它里面的GeoKeyDirectoryTag。否则会报错,我之前在做一个最大值滤波的尝试的时候就遇到这个问题,后来查到了。

但是写出的数据由于是geotiff格式的,可以用ENVI打开。

matlab regress用法 matlab中regress函数用法_数据_23


在单个像元的基础和有了这些地理函数的基础上,就可以做逐个像元的线性回归。主要是借鉴了某大神的方法,自己改进了一下。