Я не новичок в 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