利用MATLAB進行逐像元的VFC線性迴歸(一) 一些準備工作

MATLAB線性迴歸

regress函數

線性迴歸其實就是通過擬合的方法求出離散點的一元線性方程,採用的是最小二乘方法。最後能求出k,b
y=kx+by = kx + b [b,bint,r,rint,stats]=regress(y,X)[b,bint,r,rint,stats] = regress(y,X)
這裏直接用最爲常見的5個參數的regress 其中b是一個一行兩列的向量,第一個返回的是常數項,第二個返回的是k。stats有4個數夠構成,第一個是 R2R^2,用來表示這個迴歸模型是否良好,第二個數是F分佈自由度對應的F值,主要用來做F檢驗用,通過這個值大於自由度下的F0.05(m,n)F_{0.05}(m,n)以及F0.01(m,n)F_{0.01}(m,n)進行比較做F檢驗,如果利用第三個參數p值來做檢驗,如果 0.01<p<0.050.01<p<0.05表示迴歸的比較顯著。如果p<0.01p<0.01則非常顯著。
例如下面的c是10年的VFC植被覆蓋度,x爲年份,建議用1-n年份,這樣迴歸後的係數會比較大一定

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返回的順序也需要注意,這段代碼主要是用來做線性迴歸並且再作圖的。
Alt
做完圖的效果如上。也可以看到其實一元線性迴歸的樣子其實不是特別好,畢竟是特別簡單的函數式來擬合不是特別理想

Geotiffread && 等等

[a,R] = geotiffread('迴歸後的圖.tif');
info = geotiffinfo('迴歸後的圖.tif');
geotiffwrite('test.tif',a,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);

這三句話是之後要用的核心,對於遙感數據或者地學數據來說也是核心,其中[a,R]中的a是圖像的矩陣,R是一些地理框架,而info返回的是地理信息。。

Alt
info是一個結構體,R是特定的數據類型
Alt
這個是R數據的截圖,裏面有各種各樣的參數,可以忽略之。
Alt
這個是info裏面的信息,裏面有我們經常用到的包括投影信息等等。其中這個GeoTIFFTags非常的重要,對於想要寫出包含地理信息的圖像的話必須要加上它裏面的GeoKeyDirectoryTag。否則會報錯,我之前在做一個最大值濾波的嘗試的時候就遇到這個問題,後來查到了。
但是寫出的數據由於是geotiff格式的,可以用ENVI打開。
Alt
在單個像元的基礎和有了這些地理函數的基礎上,就可以做逐個像元的線性迴歸。主要是借鑑了某大神的方法,自己改進了一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章