La primera parte de este taller se puede observar en: https://rpubs.com/juperezve/603314.
6.RESULTADOS Y DISCUSIÓN DE RESULTADOS, 7.CONCLUSIONES, 8. RECOMENDACIONES.
ndvi <- (Corte4[['NIR']] - Corte4[['red']]) / (Corte4[['NIR']] + Corte4[['red']])
plot(ndvi, col = rev(terrain.colors(10)), main = 'Landsat-NDVI')
hist(ndvi,
main = "DISTRIBUCIÓN VALORES NDVI",
xlab = "NDVI",
ylab= "Frecuencia",
col = "wheat",
xlim = c(-0.5, 1),
breaks = 30,
xaxt = 'n')
axis(side=1, at = seq(-0.01,1, 0.05), labels = seq(-0.01,1, 0.05))
tablavalores <- getValues(ndvi)
km <-kmeans(na.omit(tablavalores), 11)
rNA <- setValues(raster(ndvi), 0)#crear un raster en blanco con valores por defecto 0
for(i in 1:nlayers(ndvi)){ rNA[is.na(ndvi[[i]])] <- 1}# asignar valor de 1 a valores NA del raster rbrick
rNA <- getValues(rNA)#convertir rNA en un vector de valores
tablavalores <- as.data.frame(tablavalores)#convertir tablavalores en un data frame
tablavalores$clase[rNA==0] <- km$cluster #Si rNA es 0, asignar el valor del cluster k-mean
tablavalores$clase[rNA==1] <- NA#Si rNA es 1, asignar NA
clases <- raster(ndvi)
clases <- setValues(clases, tablavalores$clase)
#asignar los valores del raster clases a partir de tablavalores$clase
A continuación se encuentra el resultado de la clasificación obtenido, en donde K-means genera los 11 cluster a partir de los resultados del NDVI (Figura 10).
#asignar los valores del raster clases a partir de tablavalores$clase
mycolor <- c("#fef65b","#ff0000", "#daa520","#0000ff","#0000ff","#00ff00","#cbbeb5",
"#c3ff5b", "#ff7373", "#00ff00", "#808080")
plot(clases, main = 'CLASIFICACIÓN NO SUPERVISADA', col = mycolor )
mycolor <- c("#fef65b","#ff0000", "#daa520","#0000ff","#0000ff","#00ff00","#cbbeb5",
"#c3ff5b", "#ff7373", "#00ff00", "#808080")
par(mfrow = c(1,2))
plot(ndvi, col = rev(terrain.colors(11)), main = 'Landsat-NDVI')
plot(clases, main = 'CLASIF NO SUPERVISADA', col = mycolor )
knitr::include_graphics("C:/informe1/ACERCAMIENTOIMGNOSUP.jpg")
entrenamiento<-readOGR(".","Entrenamiento")
## OGR data source with driver: ESRI Shapefile
## Source: "C:\informe1", layer: "Entrenamiento"
## with 487 features
## It has 4 fields
## Integer64 fields read as strings: CODIGO
head(entrenamiento@data)
## CODIGO ID_NUM ID_STRING CLASE
## 0 231 6 6 PASTOS LIMPIOS
## 1 314 14 14 BOSQUE GALERIA
## 2 314 14 14 BOSQUE GALERIA
## 3 314 14 14 BOSQUE GALERIA
## 4 314 14 14 BOSQUE GALERIA
## 5 314 14 14 BOSQUE GALERIA
knitr::include_graphics("C:/informe1/NUMCLASES.jpg")
En la Figura 14, se muestra un acercamiento de la imagen L8, compocisión 543, con la capa de coberturas de la tierra escala 25.000, realizada a partir de clasificación visual de imagenes Sentinel 2; que se utiliza para para obtener las muestras de entrenamiento de la clasificaión supervisada.
knitr::include_graphics("C:/informe1/ACERCAMIENTOIMG1.jpg")
#rasterizar poligonos
clase <- rasterize(entrenamiento, Corte4, 'ID_NUM')
spplot(clase, scales=list(draw=T), main="POLÍGONOS ENTRENAMIENTO")
tab <- table(values(clase))
print(tab)
##
## 1 2 3 4 5 6 7 8 9 10 11 12 13
## 453 242 78 337 523 39321 22718 2496 2800 213 264 141 84
## 14 15 16 17 18 19 20 21 22
## 5386 386 2696 6276 1404 537 589 51 104
sum(tab)
## [1] 87099
#aplicar mascara sobre corte4 volver rastes el vector
mascara<- mask(Corte4, clase)
entrenamiento_r <- addLayer(mascara, clase)# entrenamiento_r es el raster de los poligonos
plot(entrenamiento_r)
entrenamiento_r
## class : RasterStack
## dimensions : 1334, 1154, 1539436, 7 (nrow, ncol, ncell, nlayers)
## resolution : 30, 30 (x, y)
## extent : 586275, 620895, 1027965, 1067985 (xmin, xmax, ymin, ymax)
## crs : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0
## names : blue, green, red, NIR, SWIR1, SWIR2, layer
## min values : 130, 378, 277, 1209, 855, 519, 1
## max values : 5326, 5679, 5805, 7151, 6602, 5144, 22
El siguiente código muestra como entrenar el algoritmo y a su vez generar la matriz de confusion; para este caso se entreno para generar 100 árboles de decisión.<div
names(entrenamiento_r)<- c("blue", "green", "red", "NIR", "SWIR1","SWIR2","clase")
tablavalores <- getValues(entrenamiento_r)
tablavalores <- na.omit(tablavalores)
tablavalores <- as.data.frame(tablavalores)
tablavalores$clase <- factor(tablavalores$clase, levels = c(1:22))
modelRF <- randomForest(x=tablavalores[ ,c(1:6)], y=tablavalores$clase, ntree=100, importance = TRUE, do.trace=FALSE)
colnames(modelRF$confusion) <- c("Nubes", "Tejido Urbano Discontinuo", "Vivienda Rural Dispersa", "Vias", "Cultivo permanente arboreo", "Pastos limpios", "Pastos arbolados", "Pastos Enmalezados", "Pastos inundables", "Mosaico de cultivos", "Mosaico de pastos y cultivos", "Mosaico de pastos y espacios naturales", "Mosaico cultivos y espacios nat", "Bosque de galeria", "Plantacion forestal", "Arbustal", "Vegetacion secundaria", "Tierras desnudas y degradadas", "Zonas quemadas", "Zonas pantanosas", "lagunas", "cuerpos agua art", "error de clase")
rownames(modelRF$confusion) <- c("Nubes", "Tejido Urbano Discontinuo", "Vivienda Rural Dispersa", "Vias", "Cultivo permanente arboreo", "Pastos limpios", "Pastos arbolados", "Pastos Enmalezados", "Pastos inundables", "Mosaico de cultivos", "Mosaico de pastos y cultivos", "Mosaico de pastos y espacios naturales", "Mosaico cultivos y espacios nat", "Bosque de galeria", "Plantacion forestal", "Arbustal", "Vegetacion secundaria", "Tierras desnudas y degradadas", "Zonas quemadas", "Zonas pantanosas", "lagunas", "cuerpos agua art")
#para mejorar la clasificación deben incluirse mas poligonos que representen adecuadamente las clases seleccionadas.
#Exportar matriz de confusion a excel
#write.table(x = modelRF$confusion, file = "matriz2.txt", sep = ",", row.names = FALSE, col.names = TRUE)
knitr::include_graphics("C:/informe1/matriz_final.jpg")
knitr::include_graphics("C:/informe1/res_entren_randomforest.jpg")
se muestran abajo, indicadores que posee el modelo;en primer lugar (Mean Decrease Accuracy), el índice de disminución media de la precisión, que muestra que bandas que mejoran la precisión de la clasificación; y, el indicador de Gini o disminución media de Gini (Mean Decrease Gini), que permite identificar que bandas presentan mayor homogeneidad en la clasificación.
varImpPlot(modelRF)
Con el modelo generado y matriz de confusión,el algoritmo genera la clasificación, que contiene las 22 clases establecidas inicialmente.
predLC <- predict(Corte4, model=modelRF, filename="predicccion.tif", na.rm=TRUE, overwrite=TRUE)
save(modelRF, file="prediction_modelRF.RData")
plot(predLC, main = 'CLASIF SUPERVISADA', col = mycolor )
A continuación el calculo de precisión general del modelo y clasificación
#Precisión gral
#Numero muestras
#OA Overal Accuracy
n <- (87099)
# numero de muestras correctamente clasificadas
sum_diag <-(56619)
#Precisión
#OA <- sum(diag) / n
OA=sum_diag/n
OA
## [1] 0.6500534
A continuación, el resultado de la exactitud de usuario; es decir, la exactitud por cada clase, en donde se puede observar cuales clases arrojaron valores bajos de exactitud. Las clases que tienen mayores valores son aquellas en donde se tomaron mayor número de muestras de entrenamiento.
knitr::include_graphics("C:/informe1/exactitud usuario.jpg")
Finalmente, se calcula el Kappa global para medir la exactitud temática de la capa generada; el cual arroja un valor de 0,48; lo que indica que es necesario o bajar el nivel de la clasifcación, es decir hacer menos clases; o aumentar el numero de muestras por clase para mejorar la precisión; especialmente en las clases que arrojaron valores bajos en la matriz de confusión y exactitud de usario.
#kappa global
rowsums <- apply(modelRF$confusion, 1, sum)
p <- rowsums / n
colsums <- apply(modelRF$confusion, 2, sum)
q <- colsums / n
expAccuracy <- sum(p*q)
kappa <- (OA - expAccuracy) / (1 - expAccuracy)
kappa
## [1] 0.4848982
A continuación, se observa la comparación de las dos clasificaciones realizadas, en donde se observa que es preferible realizar una supervisada con un buen numero de zonas de entrenamiento para mejorar la calidad de la clasificación.
par(mfrow = c(1,2))
plot(predLC, col =mycolor, main = 'CLASIF SUPERVISADA')
plot(clases, main = 'CLASIF NO SUPERVISADA', col = mycolor )
El mapa de coberturas generado con el algoritmo Random Forest, se muestra a continuación.
knitr::include_graphics("C:/informe1/mapa_clasfinal.jpg")