在RStudio中将簇值创建和设置为新的k均值分类

问题描述 投票:0回答:1

我想创建一个简单的kmeans无监督分类。我在创建群集并将群集值设置为新栅格时遇到问题。此site启发了我。

landsat5 <- stack('5.tif')
names(landsat5) <- c('blue', 'green', 'red', 'NIR', 'SWIR1', 'thermal', 'SWIR2')
ndvi <- (landsat5[['NIR']] - landsat5[['red']]) / (landsat5[['NIR']] + landsat5[['red']])
nr <- getValues(ndvi)
set.seed(99)
kmncluster <- kmeans(na.omit(nr), centers = 10, iter.max = 500, nstart = 5, algorithm="Lloyd")
knr <- setValues(ndvi, kmncluster$cluster)
knr <- raster(ndvi)
values(knr) <- kmncluster$cluster
mycolor <- c("#fef65b","#ff0000", "#daa520","#0000ff","#0000ff","#00ff00","#cbbeb5",
             "#c3ff5b", "#ff7373", "#00ff00", "#808080")
par(mfrow = c(1,2))
plot(ndvi, col = rev(terrain.colors(10)), main = 'Landsat-NDVI')
plot(knr, main = 'Unsupervised classification', col = mycolor )

我收到此错误:setValues(ndvi,kmncluster $ cluster)中的错误: length(values)不等于ncell(x)或1

任何提示为何显示错误?

r classification gis k-means raster
1个回答
0
投票

正如s_t指出的那样,问题是由na.omit(nr)造成的,因为这样可以删除案例,以使案例数不再等于栅格像元数。

问问题时,请始终提供一个最小的,可复制的,独立的示例,如下所示

library(raster)
b <- brick(system.file("external/rlogo.grd", package="raster"))
vi <- (b$red - b$green) / (b$red + b$green)
nr <- getValues(vi)

NA中有nr值(其中red+green == 0),需要删除这些值才能使用kmeans。但是可以不用na.omit来执行

i <- !is.na(nr)
set.seed(99)
kmncluster <- kmeans(nr[i], centers = 10, iter.max = 500, nstart = 5, algorithm="Lloyd")

现在您可以将nr中的值替换为其群集成员身份,并将这些值放入RasterLayer中

nr[i] <- kmncluster$cluster
knr <- setValues(vi, nr)
plot(knr)
© www.soinside.com 2019 - 2024. All rights reserved.