आर में kmeans के साथ असुरक्षित वर्गीकरण


10

मेरे पास उपग्रह चित्रों (5 बैंड) की एक समय श्रृंखला है और आर में किमी द्वारा उन्हें वर्गीकृत करना चाहते हैं। मेरी स्क्रिप्ट ठीक काम कर रही है (मेरी छवियों के माध्यम से लूप, छवियों को डेटा में परिवर्तित करें। उन्हें, क्लस्टर करें और उन्हें वापस कन्वर्ट करें रेखापुंज):

for (n in files) {
image <- stack(n)    
image <- clip(image,subset)

###classify raster
image.df <- as.data.frame(image)  
cluster.image <- kmeans(na.omit(image.df), 10, iter.max = 10, nstart = 25) ### kmeans, with 10 clusters

#add back NAs using the NAs in band 1 (identic NA positions in all bands), see http://stackoverflow.com/questions/12006366/add-back-nas-after-removing-them/12006502#12006502
image.df.factor <- rep(NA, length(image.df[,1]))
image.df.factor[!is.na(image.df[,1])] <- cluster.image$cluster

#create raster output
clusters <- raster(image)   ## create an empty raster with same extent than "image"  
clusters <- setValues(clusters, image.df.factor) ## fill the empty raster with the class results  
plot(clusters)
}

मेरी समस्या यह है: मैं वर्गीकरण परिणामों की एक दूसरे से तुलना नहीं कर सकता क्योंकि क्लस्टर असाइनमेंट छवि से छवि में भिन्न होते हैं। उदाहरण के लिए, "पानी" पहली छवि क्लस्टर नंबर 1 में है, अगले 2 में और तीसरे 10 में, तारीखों के बीच पानी के परिणामों की तुलना करना असंभव बनाता है।

मैं क्लस्टर असाइनमेंट कैसे ठीक कर सकता हूं?

क्या मैं सभी छवि के लिए एक निश्चित प्रारंभिक बिंदु निर्दिष्ट कर सकता हूं (उम्मीद है कि पानी हमेशा पहले पाया जाता है और इस प्रकार 1 के रूप में वर्गीकृत किया गया है)?

और यदि हाँ, तो कैसे?

जवाबों:


6

मुझे लगता है कि आप नहीं कर सकते ... आपको उनकी तुलना करने के लिए पहले प्रत्येक वर्ग को लेबल करना होगा। Kmean बिना किसी पूर्व सूचना के अनिश्चित रूप से वर्गीकृत करते हैं और इसलिए किसी भी प्रकार की कक्षाओं को परिभाषित नहीं कर सकते हैं।

यदि आपके पास एक संदर्भ परत है, तो आप बहुसंख्यक मतदान द्वारा एक लेबलिंग कर सकते हैं। यहां 'रैस्टर' पैकेज फ़ंक्शन का उपयोग करने की तुलना में बहुसंख्यक मतदान के लिए एक अधिक कुशल कोड है zonal:

require (data.table)
fun <- match.fun(modal)
vals <- getValues(ref) 
zones <- round(getValues(class_file), digits = 0) 
rDT <- data.table(vals, z=zones) 
setkey(rDT, z) 
zr<-rDT[, lapply(.SD, modal,na.rm=T), by=z]

refआपका रैस्टर क्लास संदर्भ फ़ाइल कहां है, class_fileक्या आपका किमी परिणाम है।

zr आपको पहले कर्नल को 'ज़ोन' नंबर और दूसरे कोलो में, कक्षा के लिए लेबल देता है।


मुझे डर था कि यह संभव नहीं है। बहुसंख्यक मतदान के लिए कोड के लिए धन्यवाद!
आइरिस

4

एक छवि स्टैक पर क्लस्टरिंग को लागू करने के लिए, आप इसे बैंड-बाय-बैंड नहीं करते हैं, बल्कि पूरे छवि स्टैक पर एक साथ करते हैं। अन्यथा, जैसा कि @nmatton द्वारा बताया गया है, आँकड़ा बहुत मायने नहीं रखता है।

हालांकि, मैं इस बात से सहमत नहीं हूं कि यह संभव नहीं है, बस स्मृति गहन है। वास्तविक उपग्रह डेटा पर यह एक बड़ी समस्या होगी, और शायद उच्च रिज़ॉल्यूशन डेटा पर यह असंभव है, लेकिन आप अपने रास्टर (ओं) को एक एकल ऑब्जेक्ट में जमा करके स्मृति में प्रक्रिया कर सकते हैं जिसे क्लस्टरिंग फ़ंक्शन को पास किया जा सकता है। आपको एनए मानों को रेखापुंजों पर नज़र रखने की आवश्यकता होगी क्योंकि उन्हें क्लस्टरिंग के दौरान हटा दिया जाएगा और आपको रेखापुंज में स्थितियां जानने की आवश्यकता होगी ताकि आप क्लस्टर मानों को सही कक्षों में असाइन कर सकें।

हम यहां एक दृष्टिकोण से कदम बढ़ा सकते हैं। आवश्यक लाइब्रेरी और कुछ उदाहरण डेटा (आरजीबी आर लोगो हमें काम करने के लिए 3 बैंड देने के लिए) जोड़ने देता है।

library(raster)
library(cluster)
r <- stack(system.file("external/rlogo.grd", package="raster")) 
  plot(r)

सबसे पहले, हम getValues ​​का उपयोग करके डेटा के लिए हमारी मल्टी-बैंड रेखापुंज स्टैक ऑब्जेक्ट को ले जा सकते हैं। ध्यान दें कि मैं पंक्ति 1, कॉलम 3 पर NA मान जोड़ रहा हूं ताकि मैं यह बता सकूं कि बिना डेटा के कैसे व्यवहार किया जाए।

r.vals <- getValues(r[[1:3]])
  r.vals[1,][3] <- NA

यहां, हम व्यापार के लिए नीचे उतर सकते हैं और गैर-एनए मानों का एक सेल इंडेक्स बना सकते हैं जिसका उपयोग क्लस्टर परिणामों को असाइन करने के लिए किया जाएगा।

idx <- 1:ncell(r)
idx <- idx[-unique(which(is.na(r.vals), arr.ind=TRUE)[,1])]  

अब, हम k = 4 के साथ 3 बैंड RGB मान से एक क्लस्टर ऑब्जेक्ट बनाते हैं। मैं क्लारा के-मेडोइड्स विधि का उपयोग कर रहा हूं क्योंकि यह बड़े डेटा के साथ अच्छा है और विषम वितरण के साथ बेहतर है। यह के-मीन्स के समान है।

clus <- cluster::clara(na.omit(scale(r.vals)), k=4)

सादगी के लिए, हम अपने मूल रेखापुंज स्टैक ऑब्जेक्ट से एक रास्टर बैंड को खींचकर और एनए मान निर्दिष्ट करके एक खाली रेखापुंज बना सकते हैं।

r.clust <- r[[1]]
r.clust[] <- NA

अंत में, इंडेक्स का उपयोग करते हुए, हम क्लस्टर मानों को खाली रैस्टर में उपयुक्त सेल को असाइन करते हैं और परिणामों को प्लॉट करते हैं।

r.clust[idx] <- clus$clustering
plot(r.clust) 

विशाल आपदाओं के लिए आप बड़े-बड़े पैकेज में देखना चाहते हैं जो मैट्रिक को डिस्क और ब्लॉक्स पर लिखते हैं और एक k- साधन उपलब्ध है। यह भी ध्यान रखें कि यह वही नहीं है जो R के लिए डिज़ाइन किया गया था और यह कि इमेज प्रोसेसिंग या GIS सॉफ्टवेयर अधिक उपयुक्त हो सकता है। मुझे पता है कि SAGA और Orfeo टूलबॉक्स दोनों मुफ्त सॉफ्टवेयर हैं जिनके पास k- साधन क्लस्टरिंग छवि ढेर के लिए उपलब्ध हैं। यहां तक ​​कि एक आरएसएजीए पुस्तकालय भी है जो सॉफ्टवेयर को आर से कॉल करने की अनुमति देता है।


यदि सभी छवियों को एक ही बार में स्टैक्ड और क्लस्टर किया जाता है, तो, परिणाम एक क्लस्टर्ड इमेज है, है ना?
आइरिस

@ इरीस, हाँ यह इस प्रकार की छवि क्लस्टरिंग काम करता है और रिमोट सेंसिंग सॉफ़्टवेयर में कार्यान्वयन का अनुसरण करता है। एक स्पष्ट और प्रासंगिक उदाहरण आर्कगिस ( डेस्कटॉप .arcgis.com/en/arcmap/10.3/tools/spatial-analyst-toolbox/… ) में आइसोक्लस्टर कार्यान्वयन होगा
जेफरी इवांस

तब यह एवर बिल्कुल मदद नहीं करता है। मेरी समस्या यह थी कि मैंने कई अप्रकाशित छवि वर्गीकरणों के आधार पर समय के साथ एक परिवर्तन का पता लगाने की कोशिश की, लेकिन मैं विभिन्न परिणामों की तुलना कर सकता था क्योंकि कक्षाएं अलग-अलग सौंपी गई थीं।
आइरिस

परिवर्तन का पता लगाने के लिए अनसुप्राइज़्ड वर्गीकरण व्यवहार्य तरीका नहीं है। किसी दिए गए चित्र में थोड़ी भिन्नता भी पिक्सेल को एक अलग वर्ग में सौंपे जाने के साथ समाप्त हो सकती है। यदि आप के-मीन्स के लिए क्लस्टर केंद्र प्रदान करते हैं तो भी यही स्थिति होगी। मेरा स्थानिक पैकेज में एक एंट्रोपी फ़ंक्शन है जो परिवर्तन का पता लगाने के लिए उपयोगी है। आप एनएक्सएन विंडो के भीतर एन्ट्रापी की गणना करते हैं और फिर प्रत्येक टाइम-स्टेप पर डेल्टा प्राप्त करते हैं। नकारात्मक एन्ट्रापी नुकसान का प्रतिनिधित्व करता है और सकारात्मक अधिकतम एन्ट्रापी के तहत एक परिमाण के भीतर परिदृश्य घटकों का लाभ है।
जेफरी इवांस

यह एक पुराना प्रश्न है और मैंने k- साधन युगों का उपयोग करने से पहले विचार किया था। लेकिन अगली बार के लिए स्थानिक पैकेज जानने के लिए अच्छा है;)
आइरिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.