MATLAB線性迴歸
regress函數
線性迴歸其實就是通過擬合的方法求出離散點的一元線性方程,採用的是最小二乘方法。最後能求出k,b
即
這裏直接用最爲常見的5個參數的regress 其中b是一個一行兩列的向量,第一個返回的是常數項,第二個返回的是k。stats有4個數夠構成,第一個是 ,用來表示這個迴歸模型是否良好,第二個數是F分佈自由度對應的F值,主要用來做F檢驗用,通過這個值大於自由度下的以及進行比較做F檢驗,如果利用第三個參數p值來做檢驗,如果 表示迴歸的比較顯著。如果則非常顯著。
例如下面的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返回的順序也需要注意,這段代碼主要是用來做線性迴歸並且再作圖的。
做完圖的效果如上。也可以看到其實一元線性迴歸的樣子其實不是特別好,畢竟是特別簡單的函數式來擬合不是特別理想
Geotiffread && 等等
[a,R] = geotiffread('迴歸後的圖.tif');
info = geotiffinfo('迴歸後的圖.tif');
geotiffwrite('test.tif',a,R,'GeoKeyDirectoryTag',info.GeoTIFFTags.GeoKeyDirectoryTag);
這三句話是之後要用的核心,對於遙感數據或者地學數據來說也是核心,其中[a,R]中的a是圖像的矩陣,R是一些地理框架,而info返回的是地理信息。。
info是一個結構體,R是特定的數據類型
這個是R數據的截圖,裏面有各種各樣的參數,可以忽略之。
這個是info裏面的信息,裏面有我們經常用到的包括投影信息等等。其中這個GeoTIFFTags非常的重要,對於想要寫出包含地理信息的圖像的話必須要加上它裏面的GeoKeyDirectoryTag。否則會報錯,我之前在做一個最大值濾波的嘗試的時候就遇到這個問題,後來查到了。
但是寫出的數據由於是geotiff格式的,可以用ENVI打開。
在單個像元的基礎和有了這些地理函數的基礎上,就可以做逐個像元的線性迴歸。主要是借鑑了某大神的方法,自己改進了一下。