Очень грязный результат после выполнения k-средних в стеке изображений в rstudio - PullRequest
0 голосов
/ 27 января 2020

Я не новичок в R, но мои знания еще не очень развиты.

Я выполняю неконтролируемую классификацию стека 14-слойных спутниковых изображений (11 полос Sentinel 2, 2 полосы Sentinel 1 и 1 слой батиметрии); Вот как это выглядит:

> all_Urok
class      : RasterStack
dimensions : 2606, 3548, 9246088, 14  (nrow, ncol, ncell, nlayers)
resolution : 10, 10  (x, y)
extent     : 377490, 412970, 1259960, 1286020  (xmin, xmax, ymin, ymax)
crs        : +proj=utm +zone=28 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
names      :          B02,          B03,          B04,          B05,          B06,          B07,          B08,         B08a,          B09,          B11,          B12,        S1_VH,        S1_VV, bijagos_batim 
min values :        283.0,        401.0,        261.0,         77.0,          1.0,        232.0,        270.0,        136.0,        105.0,        220.0,        178.0,          0.0,          0.0,           1.8 
max values : 4484.0000000, 3882.0000000, 4516.0000000, 4901.0000000, 4868.0000000, 4835.0000000, 6092.0000000, 4937.0000000, 4338.0000000, 5590.0000000, 5174.0000000,    0.1114188,    1.0683648,     4.2000000 

Я использую алгоритм Хартигана-Вонга k-средних с использованием следующего кода (предположим, что растровый стек называется all_Urok):

    ## kmeans classification
### all Urok
values1_all_Urok<-scale(getValues(all_Urok)) ## Extract values from each band, but scale the values as we don’t want the k-means algorithm to depend to an arbitrary variable unit
i_all_Urok<-which(!is.na(values1_all_Urok)) ## k-means can't deal with missing values, so create an vector with the positions without NA
values1_all_Urok<-na.omit(values1_all_Urok) ## omit NA values from data

beginCluster()

#### kmeans classification Urok 10 classes
set.seed(3)
E_all_Urok<-kmeans(values1_all_Urok,10,iter.max=1000,nstart=25,algorithm="Hartigan-Wong")
kmeans_raster_all_Urok<-raster(all_Urok)
kmeans_raster_all_Urok[i_all_Urok]<-E_all_Urok$cluster

endCluster()

plot(kmeans_raster_all_Urok,col=magma(10),main="kmeans 10 all Urok 20200105",colNA="lightskyblue")

Вызов для E_all_Urok выглядит так:

> E_all_Urok
K-means clustering with 10 clusters of sizes 228755, 12440, 232307, 54197, 122571, 85252, 149323, 49717, 23417, 13997

Cluster means:
          B02        B03        B04        B05        B06        B07        B08        B08a         B09          B11         B12
1  -0.2519086 -0.2852514 -0.2538923 -0.2718975 -0.2203113 -0.2268587 -0.2113052 -0.18009261 -0.08590013  0.161464121  0.14560195
2  -1.2890525 -1.0703041 -0.9796645 -0.5935867 -0.1447406 -0.1139179 -0.1331364 -0.08007656  0.21203143  0.655487837  0.52488092
3  -0.3918317 -0.4065338 -0.4315226 -0.4542555 -0.5030089 -0.5134804 -0.5108016 -0.52790691 -0.64934190 -0.630150917 -0.53924441
4  -0.7271596 -0.6855769 -0.5270063 -0.4024963 -0.1647938 -0.1365298 -0.1200687 -0.06255428  0.21952291  0.518276069  0.43225567
5  -0.7178268 -0.6989707 -0.8073404 -0.8611672 -1.1468080 -1.1480219 -1.1613256 -1.27153452 -1.35625175 -1.017375940 -0.82338450
6   1.2495821  1.3199964  1.3531725  1.4135771  1.2950373  1.2767707  1.2396618  1.21161083  0.90010802  0.053219406 -0.14174461
7   0.4850795  0.4729654  0.4843657  0.4255212  0.3342740  0.3182134  0.3048972  0.29349007  0.19095734  0.003243359 -0.05130027
8   2.2261294  2.3852795  2.1466689  2.3958295  2.2761610  2.2234372  2.1378435  2.09462755  1.69390047  0.693663958  0.37189512
9   0.3510658  0.2819199  0.2548869  0.2455973  0.3182388  0.3149387  0.3231941  0.36559035  0.57241331  0.547267676  0.43495029
10  1.9944060  2.2436773  1.8396734  2.3579388  2.5011408  2.4619385  2.3783602  2.34733906  2.15358775  1.193919670  0.78771082
         S1_VH       S1_VV bijagos_batim
1  -0.06641239  0.03087220  -0.074025577
2   6.57257936  5.49376715   0.294377437
3  -0.15178551 -0.34047728  -0.236745455
4   1.50096078  2.22885485   0.098164738
5  -0.14866159 -0.36338094  -0.394076713
6  -0.11938328 -0.07017478  -0.178744472
7  -0.09976054 -0.07021293  -0.161356171
8  -0.11550335  0.14557686  -0.008899156
9   0.15627050  0.71037589   4.281642890
10  0.34898760  0.73862505   3.936398339

Clustering vector:
   [1] 5 5 5 5 5 5 5 5 5 5 5 5 5 3 5 5 5 5 5 5 5 5 3 5 5 5 5 1 4 4 5 3 7 5 5 5 5 1 4 4 5 3 7 5 5 1 1 4 1 7 5 1 1 5 1 7 5 5 5 5 5 5 3
  [64] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
 [127] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 3 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
 [190] 5 5 5 5 3 4 4 4 7 5 4 2 2 7 5 4 2 2 7 5 4 2 4 7 5 4 4 4 7 5 4 4 1 3 1 7 3 3 7 5 1 3 7 5 3 3 7 7 3 3 7 7 5 5 5 5 5 5 5 5 5 5 5
 [253] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 3 3 5 5 4 4 4 3 5 5 4 4 4 4 4 4 3 5 5 5 5 4 4 2 4 2 2 4 4 5 5 5 5 5 4
 [316] 2 2 2 2 2 2 4 4 4 3 5 5 5 5 5 5 5 5 4 2 2 2 4 4 2 4 4 4 1 5 5 5 5 5 5 5 5 5 5 1 4 2 2 2 4 4 2 4 4 4 1 5 5 5 5 1 1 3 3 5 5 5 5
 [379] 5 5 5 1 4 2 2 2 2 4 4 4 4 4 1 5 5 5 1 1 1 3 5 5 5 5 5 5 5 5 5 5 1 4 2 2 2 2 4 4 2 2 4 4 5 5 5 5 1 1 1 1 3 3 5 5 5 5 5 5 5 5 5
 [442] 5 5 5 1 4 2 2 2 2 2 2 2 2 4 4 5 5 5 5 1 1 1 1 3 3 5 5 5 5 5 5 5 5 3 3 1 1 4 2 2 2 2 2 2 2 2 4 4 4 5 5 3 1 1 1 3 3 5 5 5 5 5 5
 [505] 5 5 5 3 3 1 1 4 2 2 2 2 2 2 2 2 2 2 2 4 5 1 1 1 1 3 3 5 5 5 5 5 5 5 5 5 5 3 3 1 1 1 1 4 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 1 1 3 3
 [568] 5 5 5 5 5 5 5 5 5 5 5 5 5 3 3 1 1 1 4 2 2 2 2 2 2 2 2 2 2 2 2 4 4 4 4 4 1 3 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 1 1 1 1 1 4 2 2 2 2
 [631] 2 2 2 2 2 2 2 4 2 2 2 4 4 1 3 3 5 5 5 5 5 5 5 5 5 5 3 5 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 4 4 2 2 2 2 4 4 1 3 3 5 5 5 5 5 5 5 5 5
 [694] 5 3 3 3 1 1 1 1 1 2 2 2 2 2 2 4 4 4 2 4 2 2 2 2 2 4 4 1 3 3 5 5 5 3 5 5 5 5 5 5 3 3 3 3 1 1 1 1 4 4 2 2 2 2 4 1 1 1 4 2 2 2 2
 [757] 2 4 4 1 1 1 3 5 5 3 3 5 5 5 5 3 3 3 3 3 1 1 1 1 4 4 2 2 2 2 4 1 1 4 2 2 2 4 4 4 1 1 1 1 1 1 1 1 5 5 5 5 3 3 3 3 3 1 1 1 4 4 2
 [820] 2 2 2 2 4 9 9 2 2 2 4 4 4 1 1 1 1 1 1 1 3 5 5 5 5 3 3 3 3 3 3 1 1 4 4 2 2 2 2 2 2 9 9 4 2 2 4 4 4 1 1 1 1 1 1 1 1 5 5 5 5 5 5
 [883] 5 5 3 3 3 3 3 3 3 4 2 2 2 2 2 2 4 9 4 2 2 4 4 4 1 1 1 1 1 1 1 1 5 5 5 5 5 5 5 5 5 5 5 5 3 3 3 3 3 3 3 5 4 2 2 2 2 2 2 2 1 4 2
 [946] 2 4 4 4 4 1 1 1 1 1 1 1 5 5 5 5 5 3 1 1 5 5 5 5 5 3 3 3 3 3 3 5 4 4 2 2 2 2 2 2 2 4 4 2 2 2 4 4 4 1 1 1 1 1 1
 [ reached getOption("max.print") -- omitted 970976 entries ]

Within cluster sum of squares by cluster:
 [1] 277595.3 257381.5 244330.6 274189.7 158375.8 226517.9 285474.4 148288.4 226390.5 149939.0
 (between_SS / total_SS =  79.4 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"    "size"         "iter"        
[9] "ifault"

И полученный график представляет собой очень грязный результат:

график, полученный после k-средних

I не знаю, почему это происходит, потому что, когда я использую меньше полос (слоев), это работает. Интересно, связано ли это с предупреждениями, которые я получаю после вызова функции kmeans, здесь:

There were 25 warnings (use warnings() to see them)

> warnings()
Warning messages:
1: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
2: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
3: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
4: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
5: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
6: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
7: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
8: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
9: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
10: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
11: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
12: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
13: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
14: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
15: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
16: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
17: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
18: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
19: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
20: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
21: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
22: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
23: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
24: Quick-TRANSfer stage steps exceeded maximum (= 48598800)
25: Quick-TRANSfer stage steps exceeded maximum (= 48598800)

Может кто-нибудь помочь? Я не могу найти ничего подобного в других сообщениях здесь. Заранее спасибо!

Обновление: думаю, я понял, что происходит, но все еще не могу с этим справиться. Таким образом, на самом деле растровые слои в стеке имеют значения NA в разных позициях. Так что я думаю, что во время удаления NA все портится, и структура матрицы как-то нарушается, что приводит к грязным результатам. Я надеюсь, что у кого-то есть идея, как с этим справиться.

Cheers

...