R語言實現基於隨機森林的高光譜影像分類

在Pavia University數據中選取100×100大小的影像和參考數據,選取30個樣本作爲訓練樣本,基於隨機森林進行分類

library("R.matlab")
library("yaImpute")
library("randomForest")
PATH <- getwd();
setwd(PATH)
# 定義樣本數量
Trainnum <- 30
drow <- 100
dcol <- 100
ddim1 <- 103
# 讀入高光譜特徵數據
pathname1 <- file.path('Data','pavia_univ.mat')
pathname2 <- file.path('Data','pavia_ugt.mat')
pavia_uni_fea <- readMat(pathname1)
pavia_uni_gt  <- readMat(pathname2)
# 將list 轉爲矩陣
pavia_uni_fea <- array(do.call(cbind, pavia_uni_fea),dim = c(10000,ddim1))
# 對影像數據進行pca降維
pavia_uni_fea.pr <- princomp(pavia_uni_fea, scores=T, cor = TRUE)
plot(pavia_uni_fea.pr,type="line")
pca_data <- predict(pavia_uni_fea.pr)
ddim <- 10
pavia_uni_fea <- array(pca_data[,1:ddim], dim = c(100,100,ddim))
#  將參考數據展示出來
pavia_uni_gt <- array(do.call(cbind, pavia_uni_gt ),dim = c(100,100))
image(pavia_uni_gt, col = heat.colors(12))
pavia_uni_feanorm <- array(data = NA, dim = dim(pavia_uni_fea))

#  抽取訓練樣本
# 找到不是0的索引
pavia_no0 <- which(pavia_uni_gt>0)
# 固定她的返回結果
set.seed(100)
RandomIndex <- sample(pavia_no0, length(pavia_no0))
TrainIndex <- RandomIndex[1:Trainnum]

# 顯示訓練樣本
TrainSamp <- array(data = 0, dim = c(1,10000))
TrainSamp[TrainIndex] <- 1
TrainSamp <- array(TrainSamp,dim = c(100,100))
image(TrainSamp)
# 將訓練樣本的id轉成行列號
xtrain <- ceiling(TrainIndex/drow)
ytrain <- TrainIndex - ((xtrain -1)*drow)
# 這裏已經將訓練數據和特徵定義好了
TrainFea <- array(data = NA, dim = c(Trainnum,ddim))
TrainLabel <- array(data = NA, dim = c(Trainnum,1))
for(i in 1:Trainnum){
  TrainFea[i,1:ddim] <- array(data = pavia_uni_fea[TrainIndex[i]],dim = c(1,ddim))
  TrainLabel[i] <- array(data = pavia_uni_gt[TrainIndex[i]],dim = c(1,1))
}


# 使用RF進行分類
pavia_uni_fea1 <- array(pavia_uni_fea, dim = c(10000,ddim))
rf <- randomForest(TrainFea, TrainLabel,ntree=500)
pred<-predict(rf,pavia_uni_fea1)
pred <- array(as.numeric(pred),dim = c(100,100))
image(pred, col = heat.colors(12))

歡迎交流代碼!

發佈了4 篇原創文章 · 獲贊 1 · 訪問量 569
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章