Inversión de biomasa forestal basada en un algoritmo forestal aleatorio [Matlab Python]

1. Importancia y recorrido técnico

  Los métodos para estimar la biomasa forestal se pueden clasificar a grandes rasgos en los dos tipos siguientes: uno es el método de estimación tradicional, que utiliza principalmente métodos de muestreo para obtener datos de estudios de campo para estimar la biomasa forestal. Este método a menudo requiere más mano de obra y recursos materiales para completarse, y los datos obtenidos no tienen características de continuidad espacial y no pueden reflejar el impacto de los factores ambientales en los resultados de la estimación. El segundo es el método de estimación de la tecnología de teledetección. Las bandas de imágenes de teledetección tienen características de continuidad espacial, y son macroscópicas, rápidas y repetibles. Son útiles para estudiar la biomasa forestal y su distribución espacial proporciona las condiciones necesarias para que los resultados de la estimación no sólo se acerquen a la realidad, sino que también proporcionen información intuitiva sobre la distribución espacial de la biomasa forestal.

  La ruta utilizada esta vez es la última. El método de estimación de la tecnología de detección remota utiliza los datos de observación del satélite LandSat-8 y utiliza varios algoritmos para construir y entrenar el modelo de ajuste de biomasa utilizando cada banda. Se obtiene un modelo con mejor efecto de ajuste. A su vez, Realizar biomasa aérea forestal (AGB).

 2. Extracción de variables

Use ENVI para calcular los cinco índices seleccionados de acuerdo con la siguiente fórmula de cálculo del índice de vegetación y use la fórmula Band Math. Los cinco índices de vegetación seleccionados aquí son ARVI, NDVI, SR, OSAVI y VIGreen. Se obtienen cinco imágenes, de la siguiente manera: Mostrar.

Esta vez se seleccionaron como inversión de parámetros ARVI, NDVI, OSAVI, SR y VIGreen.

Utilice el software ENVI para calcular las características de textura de imágenes de sensores remotos, calcular su media, varianza, homogeneidad, contraste, disimilitud, entropía, segundo momento y correlación, y obtener ocho imágenes.

Significar

 

Homogeneidad

 

Aquí sólo se muestran dos imágenes.

 3. Extracción de muestras

Utilice Matlab para seleccionar los puntos de imagen aleatorios correspondientes con el mismo nombre a partir de los datos de imágenes de detección remota preprocesados, los datos de textura y los valores medidos de AGB. Esta vez, se seleccionaron 556 puntos para formar el conjunto de entrenamiento y el conjunto de verificación para el entrenamiento del modelo.

Puntos extraídos

 

clear;
AGB_data=readgeoraster("AGB_lidarplots.tif");
ARVI_data=readgeoraster("ARVI.tif");
VIGreen_data=readgeoraster("VIGreen.tif");
NDVI_data=readgeoraster("NDVI.tif");
SR_data=readgeoraster("SR.tif");
OSAVI_data=readgeoraster("OSAVI.tif");


Multi_data=readgeoraster("Multispec_ref_layer_stack_clip_corre_allstudyarea_resam_AGB.tif");
Swir1=Multi_data(:,:,2);
Nir=Multi_data(:,:,3);
Red=Multi_data(:,:,4);
Green=Multi_data(:,:,5);
Blue=Multi_data(:,:,6);
Coastal=Multi_data(:,:,7);


texture_data=readgeoraster("texture_NIR.tif");
Mean=texture_data(:,:,1);
Variance=texture_data(:,:,2);
Homogeneity=texture_data(:,:,3);
Contrast=texture_data(:,:,4);
Dissimilarity=texture_data(:,:,5);
Entropy=texture_data(:,:,6);
SecondMoment=texture_data(:,:,7);
Correlation=texture_data(:,:,8);

x=randi(266,1,1000);
y=randi(400,1,1000);

AGB_selected=zeros(1,1000);
SWIR1_selected=zeros(1,1000);
NIR_selected=zeros(1,1000);
RED_selected=zeros(1,1000);
GREEN_selected=zeros(1,1000);
Blue_selected=zeros(1,1000);
COASTAL_selected=zeros(1,1000);
NDVI_selected=zeros(1,1000);
SR_selected=zeros(1,1000);
OSAVI_selected=zeros(1,1000);
ARVI_selected=zeros(1,1000);
VIGreen_selected=zeros(1,1000);
MEAN_selected=zeros(1,1000);
Variance_selected=zeros(1,1000);
Homogeneity_selected=zeros(1,1000);
Contrast_selected=zeros(1,1000);
Dissimularity_selected=zeros(1,1000);
Entropy_selected=zeros(1,1000);
SecondMoment_selected=zeros(1,1000);
Correlation_selected=zeros(1,1000);

for i=1:size(x,2)
xi=x(1,i);
yi=y(1,i);
if xi==0 || yi==0
xi=1;
yi=1;
end
AGB_selected(1,i)=AGB_data(xi,yi);
SWIR1_selected(1,i)=Swir1(xi,yi);
NIR_selected(1,i)=Nir(xi,yi);
RED_selected(1,i)=Red(xi,yi);
GREEN_selected(1,i)=Green(xi,yi);
Blue_selected(1,i)=Blue(xi,yi);
COASTAL_selected(1,i)=Coastal(xi,yi);
NDVI_selected(1,i)=NDVI_data(xi,yi);
SR_selected(1,i)=SR_data(xi,yi);
OSAVI_selected(1,i)=OSAVI_data(xi,yi);
ARVI_selected(1,i)=ARVI_data(xi,yi);
VIGreen_selected(1,i)=VIGreen_data(xi,yi);
MEAN_selected(1,i)=Mean(xi,yi);
Variance_selected(1,i)=Variance(xi,yi);
Homogeneity_selected(1,i)=Homogeneity(xi,yi);
Contrast_selected(1,i)=Contrast(xi,yi);
Dissimularity_selected(1,i)=Dissimilarity(xi,yi);
Entropy_selected(1,i)=Entropy(xi,yi);
SecondMoment_selected(1,i)=SecondMoment(xi,yi);
Correlation_selected(1,i)=Correlation(xi,yi);
end


%输出到excel中
data=cell(1000,20);
%title={'AGB','SWIR1','NIR','RED',"GREEN",'Blue','COASTAL','NDVI','SR','OSAVI','ARVI','VIGreen','MEAN','Variance','Homogeneity','Contrast','Dissimularity','Entropy','Second Moment','Correlation'};
result=[AGB_selected;SWIR1_selected;NIR_selected;RED_selected;GREEN_selected;Blue_selected;COASTAL_selected;NDVI_selected;SR_selected;OSAVI_selected;ARVI_selected;VIGreen_selected;MEAN_selected;Variance_selected;Homogeneity_selected;Contrast_selected;Dissimularity_selected;Entropy_selected; SecondMoment_selected;Correlation_selected];
result=result';
xlswrite('data.xlsx',result)

4. Filtrado de variables

Realice una selección de variables en todos los datos para determinar las variables utilizadas en el ajuste del modelo. Puede utilizar métodos como análisis de correlación, clasificación de importancia y selección hacia adelante/hacia atrás. En este diseño integral, se utiliza el análisis de correlación. El índice de correlación de Pearson determina la correlación entre AGB y cada variable.

clear;
%读取excel数据
[num]=readtable("筛选后.xls");
AGB=table2array(num(:,1));
SWIR1=table2array(num(:,2));
NIR=table2array(num(:,3));
RED=table2array(num(:,4));
Green=table2array(num(:,5));
Blue=table2array(num(:,6));
Coastal=table2array(num(:,7));
NDVI=table2array(num(:,8));
SR=table2array(num(:,9));
OSAVI=table2array(num(:,10));
ARVI=table2array(num(:,11));
VIGreen=table2array(num(:,12));
Mean=table2array(num(:,13));
Variance=table2array(num(:,14));
Homogeneity=table2array(num(:,15));
Contrast=table2array(num(:,16));
Dissimularity=table2array(num(:,17));
Entropy=table2array(num(:,18));
SecondMoment=table2array(num(:,19));
Correlation=table2array(num(:,20));


data=[AGB,SWIR1,NIR,RED,Green,Blue,Coastal,NDVI,SR,OSAVI,ARVI,VIGreen,Mean,Variance,Homogeneity,Contrast,Dissimularity,Entropy,SecondMoment,Correlation];
data1=[SR,NDVI,OSAVI,ARVI,VIGreen];%自变量准备

[rho,pval]=corr(data,'type','Pearson');
string_name={'AGB','SWIR1','NIR','RED',"GREEN",'Blue','COASTAL','NDVI','SR','OSAVI','ARVI','VIGreen','MEAN','Variance','Homogeneity','Contrast','Dissimularity','Entropy','Second Moment','Correlation'};
x_values=string_name;
y_values=string_name;
h=heatmap(x_values,y_values,rho);
h.Title="Pearson相关性";
% colormap summer
% size(pval)
% h1=heatmap(x_values,y_values,pval);
% h1.Title="显著性水平";
% colormap summer
Matriz de confusión del índice de correlación de Pearson

 Como se puede ver en la figura anterior, la correlación entre NDVI, SR, OSAVI, ARVI, VIGreen y AGB es más fuerte que otras variables (el índice de correlación de Pearson es de aproximadamente 0,6), por lo que las cinco variables anteriores se seleccionan como variables independientes de entrada del modelo. .entrenar.

5. Modelo de predicción (algoritmo de bosque aleatorio, regresión de vector de soporte SVR de mínimos cuadrados parciales)

 5.1 Algoritmo de mínimos cuadrados parciales

La regresión de mínimos cuadrados parciales (PLSR) es un algoritmo de regresión lineal. Es un método de análisis estadístico multivariado basado en el análisis de componentes principales, que se puede utilizar para procesar la relación lineal entre múltiples variables independientes y una o más variables dependientes en conjuntos de datos de alta dimensión. El algoritmo PLSR reduce la dimensionalidad del conjunto de datos al proyectar las variables independientes y dependientes en un nuevo espacio de estado y puede resolver el problema de multicolinealidad entre variables independientes. Su propósito es minimizar la suma de cuadrados de los errores de predicción para encontrar el mejor modelo de predicción.

Los pasos principales del algoritmo PLSR incluyen:

  1. Elija la dirección de proyección
  2. Calcular el coeficiente de proyección.
  3. Realizar análisis de regresión sobre variables proyectadas.
  4. Resultados de regresión con validación cruzada
  5. Elija el mejor modelo de predicción

El código se muestra a continuación:

%训练集和验证集数据个数分别为
VerifySize=round(size(AGB,1)/3);
TrainSize=size(AGB,1)-VerifySize;

input=data1(1:TrainSize,:);%训练输入值(自变量)
predict_input=data1(TrainSize:end,:);%验证输入值(自变量)
output=AGB(1:TrainSize,:);%训练输出值(因变量)
predict_output=AGB(TrainSize:end,:);%验证输出值(因变量)

%偏最小二乘

var=[input,output];
mu=mean(var);sig=std(var); %求均值和标准差
rr=corrcoef(var); %求相关系数矩阵
ab=zscore(var); %数据标准化
a=ab(:,1:5); %提出标准化后的自变量数据
b=ab(:,6); %提出标准化后的因变量数据

%% 判断提出成分对的个数
[XL,YL,XS,YS,BETA,PCTVAR,MSE,stats] =plsregress(a,b);
xw=a\XS; %求自变量提出成分的系数,每列对应一个成分,这里xw等于stats.W
yw=b\YS; %求因变量提出成分的系数
a_0=PCTVAR(1,:);b_0=PCTVAR(2,:);% 自变量和因变量提出成分的贡献率
a_1=cumsum(a_0);b_1=cumsum(b_0);% 计算累计贡献率
i=1;%赋初始值
while ((a_1(i)<0.999)&(a_0(i)>0.001)&(b_1(i)<0.999)&(b_0(i)>0.001)) % 提取主成分的条件
i=i+1;
end
ncomp=i;% 选取的主成分对的个数
fprintf('%d对成分分别为:\n',ncomp);% 打印主成分的信息
for i=1:ncomp
fprintf('第%d对成分:\n',i);
fprintf('u%d',i);
for k=1:size(a,2)%此处为变量x的个数
fprintf('+(%fx_%d)',xw(k,i),k);
end
fprintf('\n');
fprintf('v%d=',i);
for k=1:size(b,2)%此处为变量y的个数
fprintf('+(%fy_%d)',yw(k,i),k);
end
fprintf('\n');
end

%% 确定主成分后的回归分析
[XL2,YL2,XS2,YS2,BETA2,PCTVAR2,MSE2,stats2] =plsregress(a,b,ncomp);
n=size(a,2); m=size(b,2);%n是自变量的个数,m是因变量的个数
beta3(1,:)=mu(n+1:end)-mu(1:n)./sig(1:n)*BETA2([2:end],:).*sig(n+1:end); %原始数据回归方程的常数项
beta3([2:n+1],:)=(1./sig(1:n))'*sig(n+1:end).*BETA2([2:end],:); %计算原始变量x1,...,xn的系数,每一列是一个回归方程
fprintf('最后得出如下回归方程:\n')
for i=1:size(b,2)%此处为变量y的个数
fprintf('y%d=%f',i,beta3(1,i));
for j=1:size(a,2)%此处为变量x的个数
fprintf('+(%f*x%d)',beta3(j+1,i),j);
end
fprintf('\n');
end
%% 求预测值
y1 = repmat(beta3(1,:),[size(predict_input,1),1])+predict_input(:,[1:n])*beta3([2:end],:); %求y1,..,ym的预测值
y0 = predict_output(:,end-size(y1,2)+1:end); % 真实值

abs(y1-y0);

%%求整体预测值(精度评定)
y_all=repmat(beta3(1,:),[size(data1,1),1])+data1(:,[1:n])*beta3([2:end],:);
y_real=AGB(:,end-size(y1,2)+1:end);
abs(y_all-y_real);

RMSE=sqrt(sum((y_all-y_real).*(y_all-y_real))/size(data1,1));
R2=1-sum((y_all-y_real).^2)/sum((y_real-mean(y_real)).^2);

y2=predict_output;
y3 = repmat(beta3(1,:),[size(predict_input,1),1])+predict_input(:,[1:n])*beta3([2:end],:);

plotregression(y2,y3)
ylabel("AGB预测值(kg/ha)")
xlabel("AGB实际测量值(kg/ha)")
title("偏最小二乘实现模型拟合结果(R=0.73291,RMSE=39.7270)")

El gráfico de resultados es el siguiente:

 5.2RF-Algoritmo de bosque aleatorio

El árbol de decisión es un algoritmo clásico de aprendizaje automático que se puede utilizar para abordar problemas de clasificación y problemas de regresión. También es el algoritmo de aprendizaje automático que suelen elegir los alumnos débiles en el aprendizaje conjunto. Como RF, GBDT.

Un árbol de decisión es una estructura de árbol en la que cada nodo interno representa una prueba de un atributo, cada rama representa una salida de prueba y cada nodo hoja representa una categoría. El árbol de decisión es un algoritmo de aprendizaje automático supervisado basado en reglas si-entonces-si no.

El algoritmo de aprendizaje del árbol de decisión suele ser un proceso de selección recursiva de las características óptimas y dividir los datos de entrenamiento según las características para que cada conjunto de subdatos tenga la mejor clasificación. Este proceso corresponde a la división del espacio de características y la construcción de árboles de decisión. Bosque aleatorio (RF)

El bosque aleatorio (RF) es en realidad árboles de decisión múltiples. Se obtienen diferentes conjuntos de muestras de entrenamiento volviendo a muestrear muestras, y los alumnos se entrenan por separado en estos nuevos conjuntos de muestras de entrenamiento. Finalmente, los resultados de cada alumno se combinan como el resultado final del aprendizaje, donde el peso de cada muestra es el mismo. Como se muestra abajo:

Entre ellos, en este método, los alumnos b son independientes entre sí, lo que hace que este método sea más fácil de paralelizar. El método bootstrap realiza un muestreo aleatorio con reemplazo. El alumno es el árbol de decisión DT.

Pasos del algoritmo

Cada árbol se genera según las siguientes reglas:

(1) Si el tamaño del conjunto de entrenamiento es N, para cada árbol, se seleccionan aleatoriamente N muestras de entrenamiento del conjunto de entrenamiento con reemplazo como conjunto de entrenamiento del árbol. (Cada árbol tiene un conjunto de entrenamiento diferente y contiene muestras repetidas)

(2) Si la dimensión de característica de cada muestra es M, especifique una constante m << M, seleccione aleatoriamente m subconjuntos de características de M características y seleccione el mejor subconjunto de características de estas m características cada vez que se divida el árbol. (Repita hasta que no se puedan hacer más divisiones)

(3) Cada árbol crece en su máxima extensión y no existe ningún proceso de poda. (Construya una gran cantidad de árboles de decisión para formar un bosque)

Aleatorio: muestras aleatorias y características aleatorias (para garantizar que no sea fácil caer en un sobreajuste)

Problema de clasificación: para la muestra de prueba, cada árbol de decisión en el bosque dará la categoría final, finalmente, el resultado de cada árbol se considerará de manera integral y la decisión se tomará mediante votación.

Entre ellos, en este método, los alumnos b son independientes entre sí, lo que hace que este método sea más fácil de paralelizar. El método bootstrap realiza un muestreo aleatorio con reemplazo. El alumno es el árbol de decisión DT.

  1. Pasos del algoritmo

Cada árbol se genera según las siguientes reglas:

(1) Si el tamaño del conjunto de entrenamiento es N, para cada árbol, se seleccionan aleatoriamente N muestras de entrenamiento del conjunto de entrenamiento con reemplazo como conjunto de entrenamiento del árbol. (Cada árbol tiene un conjunto de entrenamiento diferente y contiene muestras repetidas)

(2) Si la dimensión de característica de cada muestra es M, especifique una constante m << M, seleccione aleatoriamente m subconjuntos de características de M características y seleccione el mejor subconjunto de características de estas m características cada vez que se divida el árbol. (Repita hasta que no se puedan hacer más divisiones)

(3) Cada árbol crece en su máxima extensión y no existe ningún proceso de poda. (Construya una gran cantidad de árboles de decisión para formar un bosque)

Aleatorio: muestras aleatorias y características aleatorias (para garantizar que no sea fácil caer en un sobreajuste)

Problema de clasificación: para la muestra de prueba, cada árbol de decisión en el bosque dará la categoría final, finalmente, el resultado de cada árbol se considerará de manera integral y la decisión se tomará mediante votación.

Gráfico de tendencia de MSE frente a árboles y hojas

 

Se puede ver en la imagen que cuando el número de árboles es cercano a 166, el MSE disminuye lentamente, y cuando el número de hojas es 20, el valor de MSE es el más pequeño. Entonces, la cantidad de árboles en este modelo es 166 y la cantidad de hojas es 20.

Utilice el conjunto de entrenamiento para entrenar el modelo, ingrese las variables independientes, calcule el valor predicho y determine detener el entrenamiento cuando el RMSE sea inferior a 35.

El resultado es el siguiente:

 

El código se muestra a continuación:

%RF随机森林
clc;
clear;
[num]=readtable("筛选后.xls");
AGB=table2array(num(:,1));
NDVI=table2array(num(:,8));
SR=table2array(num(:,9));
OSAVI=table2array(num(:,10));
ARVI=table2array(num(:,11));
VIGreen=table2array(num(:,12));
data1=[SR,NDVI,OSAVI,ARVI,VIGreen];%自变量准备

%训练集
input=data1(:,:);%训练输入值(自变量)
output=AGB(:,:);%训练输出值(因变量)


%判断RF算法的叶子数和决策树的数目
for RFOptimizationNum=1:5
RFLeaf=[5,10,20,50,100,200,500];
col='rgbcmyk';
figure('Name','RF Leaves and Trees');
for i=1:length(RFLeaf)
RFModel=TreeBagger(2000,data1,AGB,'Method','R','OOBPrediction','On','MinLeafSize',RFLeaf(i));
plot(oobError(RFModel),col(i));
hold on
end
xlabel('Number of Grown Trees');
ylabel('Mean Squared Error') ;
LeafTreelgd=legend({'5' '10' '20' '50' '100' '200' '500'},'Location','NorthEast');
title(LeafTreelgd,'Number of Leaves');
hold off;
disp(RFOptimizationNum);
end

%由图像可知 当Tree的数目位于166附近时,MSE减少的趋势缓慢,且当叶子数为20时,MSE的值最小

RFRMSEMatrix=[];
RFrAllMatrix=[];
RFRunNumSet=50000;
for RFCycleRun=1:RFRunNumSet
% 训练集数据划分
RandomNumber=(randperm(length(output),floor(length(output)/3)))';
TrainYield=output;
TestYield=zeros(length(RandomNumber),1);
TrainVARI=input;
TestVARI=zeros(length(RandomNumber),size(TrainVARI,2));
for i=1:length(RandomNumber)
m=RandomNumber(i,1);
TestYield(i,1)=TrainYield(m,1);
TestVARI(i,:)=TrainVARI(m,:);
TrainYield(m,1)=0;
TrainVARI(m,:)=0;
end
TrainYield(all(TrainYield==0,2),:)=[];
TrainVARI(all(TrainVARI==0,2),:)=[];

%% RF
nTree=166;
nLeaf=20;
RFModel=TreeBagger(nTree,TrainVARI,TrainYield,...
'Method','regression','OOBPredictorImportance','on', 'MinLeafSize',nLeaf);
[RFPredictYield,RFPredictConfidenceInterval]=predict(RFModel,TestVARI);


%RF模型准确度判断
RFRMSE=sqrt(sum(sum((RFPredictYield-TestYield).^2))/size(TestYield,1));
RFrMatrix=corrcoef(RFPredictYield,TestYield);
RFr=RFrMatrix(1,2);
RFRMSEMatrix=[RFRMSEMatrix,RFRMSE];
RFrAllMatrix=[RFrAllMatrix,RFr];
if RFRMSE<34
disp(RFRMSE);
break;
end
disp(RFRMSE);
disp(RFCycleRun);
end


% RF模型存储
RFModelSavePath='E:\微信存储位置\WeChat Files\wxid_xjealsgnaqio21\FileStorage\File\2023-06\海测综合设计-2020级\海测综合设计-2020级\生物量反演\data\matlab';
save(sprintf('%sRF.mat',RFModelSavePath),'nLeaf','nTree',...
'RandomNumber','RFModel','RFPredictConfidenceInterval','RFPredictYield','RFr','RFRMSE',...
'TestVARI','TestYield','TrainVARI','TrainYield');

%精度评定
R2=1-sum((RFPredictYield-TestYield).^2)/sum((output-mean(output)).^2);

5.3 Algoritmo de regresión vectorial SVR

Se crea una "zona de intervalo" a ambos lados de la función lineal, y la distancia entre esta "zona de intervalo" es ϵ (este valor a menudo se da según la experiencia). No se calcula ninguna pérdida para todas las muestras que caen en la zona de intervalo. ., es decir, solo el vector soporte tendrá impacto en su modelo de función, y finalmente el modelo optimizado se obtiene minimizando la pérdida total y maximizando el intervalo. Para modelos no lineales, como SVM, la función del núcleo se utiliza para mapear el espacio de características y luego se realiza la regresión.

 

representación formulaica

El modelo SVR también tiene algunas diferencias con el modelo de regresión lineal general tradicional en uso. La diferencia se refleja principalmente en el hecho de que la pérdida se calcula en el modelo SVR cuando y sólo cuando el valor absoluto de la diferencia entre f(x) y y es mayor que ϵ. En el modelo lineal general, la pérdida se calcula siempre que f (x) e y no sean iguales.

Los métodos de optimización de los dos modelos son diferentes: en el modelo SVR, el modelo se optimiza maximizando el ancho de la banda de intervalo y minimizando la pérdida, mientras que en el modelo de regresión lineal general, el modelo se optimiza mediante el valor promedio después del gradiente. descendencia.

 Después de dividir el conjunto de datos, establezca el parámetro de penalización y el valor de ancho ε y entrene el modelo. El resultado se muestra a continuación.

 El código se muestra a continuación:

import scipy.io as scio
import numpy as np
from sklearn import metrics
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt

matdata=scio.loadmat("data.mat")
AGB=matdata["AGB"].flatten()
ARVI=matdata["ARVI"].flatten()
NDVI=matdata["NDVI"].flatten()
OSAVI=matdata["ARVI"].flatten()
SR=matdata["ARVI"].flatten()
VIGreen=matdata["ARVI"].flatten()
data=matdata["data1"]

from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error


C = 6.0  # 惩罚项参数
epsilon = 0.001  # ε-tube宽度
model = SVR(C=C, epsilon=epsilon)

# 拟合模型
X_train, X_test, y_train, y_test = train_test_split(data, AGB, test_size=1/3, random_state=42)
print(model.fit(X_train, y_train))

# 预测
y_train_pred = model.predict(X_train)

#预测值

y_test_pred = model.predict(X_test)

#模型评估
train_rmse = mean_squared_error(y_train, y_train_pred, squared=False)
test_rmse = mean_squared_error(y_test, y_test_pred, squared=False)
print("训练集RMSE:",train_rmse)
print("测试集RMSE:",test_rmse)

train_r=metrics.r2_score(y_train, y_train_pred)
test_r=metrics.r2_score(y_test, y_test_pred)

print("训练集R2:",train_r)
print("测试集R2:",test_r)

print("回归分析")
T_y=np.array(y_test_pred).reshape((len(y_test_pred),1))
T_x=np.array(y_test).reshape((len(y_test),1))

slope,intercept=np.polyfit(y_test,y_test_pred,1)

import seaborn as sns
plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体设置-黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题


ax=sns.regplot(x=T_x,y=T_y,marker="+")
plt.title("SVR-支持向量回归拟合结果(R^2=0.404,RMSE=43.925(Mg/ha))")
plt.legend(["原始数据点",'拟合曲线',"置信区间"])
plt.ylabel("AGB预测值(Mg/ha)")
plt.xlabel("AGB实际测量值(Mg/ha)")
plt.savefig("SVR")
plt.show()

Una evaluación integral arroja:

bosque aleatorio

mínimos cuadrados parciales

Regresión vectorial SVR

R^2

 

0.744

0,732

0.404

RMSE(mg/ha)

 

28.895

39.727

43.925

En resumen, el algoritmo de ajuste de bosque aleatorio de RF tiene el mejor efecto: su coeficiente de determinación es el más cercano a 1 y el valor RMSE es el más pequeño, por lo que se utiliza el algoritmo de ajuste de bosque aleatorio de RF para el ajuste.

6. Inversión de biomasa

%使用RF模型进行反演
ARVI_data=readgeoraster("ARVI.tif");
VIGreen_data=readgeoraster("VIGreen.tif");
NDVI_data=readgeoraster("NDVI.tif");
SR_data=readgeoraster("SR.tif");
OSAVI_data=readgeoraster("OSAVI.tif");
AGB_predict=zeros(size(ARVI_data,1),size(ARVI_data,2));
%使用以上五个参数进行反演
for i=1:1:size(ARVI_data,1)
length=size(ARVI_data,2);
ARVI=ARVI_data(i,1:length);
VIGreen=VIGreen_data(i,1:length);
NDVI=NDVI_data(i,1:length);
SR=SR_data(i,1:length);
OSAVI=OSAVI_data(i,1:length);
data=[SR',NDVI',OSAVI',ARVI',VIGreen'];
[predict_result,interval]=predict(RFModel,data);
AGB_predict(i,1:length)=predict_result;
end
%完成训练后输出mat文件
5.导出反演后tif图像(Python)
import scipy.io as scio
import gdal
import numpy as np
matdata=scio.loadmat("AGB_predict.mat")
AGB=matdata['AGB_predict']
driver=gdal.GetDriverByName("GTiff")
dataset=driver.Create(r'AGB_predict.tif',400,266,1,gdal.GDT_Float32)
band=dataset.GetRasterBand(1)
band.WriteArray(AGB)

Utilice el dibujo envi para obtener el resultado:

 

Supongo que te gusta

Origin blog.csdn.net/m0_49684834/article/details/131747522
Recomendado
Clasificación