การจำแนกประเภทที่ไม่ได้รับอนุญาตกับ kmeans ใน R


10

ฉันมีอนุกรมเวลาของภาพถ่ายดาวเทียม (5 แบนด์) และต้องการจำแนกพวกมันโดย kmeans ใน R สคริปต์ของฉันทำงานได้ดี (วนผ่านรูปภาพของฉันแปลงภาพเป็น data.frame จัดกลุ่มพวกมันแล้วแปลงกลับเป็น แรสเตอร์):

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 จัดประเภท unsupervisedly โดยไม่มีข้อมูลใด ๆ มาก่อนและดังนั้นจึงไม่สามารถกำหนดประเภทของชั้นเรียนใด ๆ

หากคุณมีเลเยอร์อ้างอิงคุณสามารถสร้างป้ายกำกับโดยการลงคะแนนเสียงข้างมาก นี่เป็นโค้ดที่มีประสิทธิภาพมากกว่าสำหรับการลงคะแนนเสียงส่วนใหญ่มากกว่าการใช้ฟังก์ชั่นแพคเกจ 'raster' 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ไฟล์อ้างอิงระดับ raster ของคุณอยู่ที่ไหนclass_fileผลลัพธ์ของ kmeans ของคุณ

zr ให้เลข 'โซน' ในคอลัมน์แรกและในคอลัมน์ที่สองฉลากสำหรับชั้นเรียน


ฉันกลัวว่ามันเป็นไปไม่ได้ ขอบคุณสำหรับรหัสสำหรับการลงคะแนนส่วนใหญ่!
ไอริส

4

ในการใช้การจัดกลุ่มบนสแต็กรูปภาพคุณจะไม่ทำการแบนด์วิดท์แบบแบนด์วิดท์ มิฉะนั้นตามที่ @nmatton ชี้ให้เห็นแล้วสถิติไม่ค่อยสมเหตุสมผลนัก

อย่างไรก็ตามฉันไม่เห็นด้วยว่านี่เป็นไปไม่ได้มี แต่หน่วยความจำมาก ในข้อมูลดาวเทียมจริงนี่จะเป็นปัญหาใหญ่และอาจเป็นไปไม่ได้ในข้อมูลความละเอียดสูง แต่คุณสามารถประมวลผลในหน่วยความจำโดยการบังคับแรสเตอร์ของคุณให้เป็นวัตถุเดียวที่สามารถส่งผ่านไปยังฟังก์ชันการจัดกลุ่ม คุณจะต้องติดตามค่า NA ใน rasters เนื่องจากจะถูกลบออกระหว่างการทำคลัสเตอร์และคุณจำเป็นต้องทราบตำแหน่งในแรสเตอร์เพื่อให้คุณสามารถกำหนดค่าคลัสเตอร์ให้กับเซลล์ที่ถูกต้อง

เราสามารถผ่านหนึ่งวิธีที่นี่ ให้เพิ่มไลบรารีที่จำเป็นและข้อมูลตัวอย่าง (โลโก้ RGB R เพื่อให้เรา 3 แบนด์ทำงานด้วย)

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

ก่อนอื่นเราสามารถบีบบังคับวัตถุแรสเตอร์หลายแบนด์ของเรากับ data.frame โดยใช้ getValues โปรดทราบว่าฉันกำลังเพิ่มค่า NA ที่แถว 1 คอลัมน์ 3 เพื่อให้ฉันสามารถอธิบายวิธีการจัดการกับไม่มีข้อมูล

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

ที่นี่เราสามารถทำธุรกิจและสร้างดัชนีเซลล์ของค่าที่ไม่ใช่ NA ที่จะใช้ในการกำหนดผลลัพธ์คลัสเตอร์

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

ตอนนี้เราสร้างวัตถุคลัสเตอร์จากค่า RGB แบนด์ 3 วงด้วย k = 4 ฉันใช้วิธีคลารา K-Medoids เพราะมันดีกับข้อมูลขนาดใหญ่และดีกว่าเมื่อมีการแจกแจงแบบแปลก ๆ มันคล้ายกับ K-Means มาก

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

เพื่อความเรียบง่ายเราสามารถสร้างแรสเตอร์ว่างเปล่าโดยดึงแถบแรสเตอร์หนึ่งจากวัตถุสแต็กแรสเตอร์ดั้งเดิมของเราและกำหนดค่า NA

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

ในที่สุดการใช้ดัชนีเรากำหนดค่าคลัสเตอร์ให้กับเซลล์ที่เหมาะสมในแรสเตอร์ที่ว่างเปล่าและวางแผนผลลัพธ์

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

สำหรับ rasters ขนาดใหญ่คุณอาจต้องการดูแพคเกจ bigmemory ซึ่งเขียนเมทริกซ์ไปยังดิสก์และทำงานบนบล็อกและมีฟังก์ชัน k-mean นอกจากนี้โปรดทราบว่านี่ไม่ใช่สิ่งที่ R ได้รับการออกแบบมาอย่างเหมาะสมและการประมวลผลข้อมูลภาพหรือซอฟต์แวร์ GIS อาจเหมาะสมกว่า ฉันรู้ว่ากล่องเครื่องมือ SAGA และ Orfeo เป็นทั้งซอฟต์แวร์เสรีที่มีการจัดกลุ่ม k-mean สำหรับภาพกอง มีแม้แต่ไลบรารี RSAGA ที่อนุญาตให้ซอฟต์แวร์ถูกเรียกจาก R


หากภาพทั้งหมดซ้อนกันและทำคลัสเตอร์ในครั้งเดียวผลที่ได้คือภาพหนึ่งภาพใช่ไหม?
ไอริส

@ ฉันใช่นี่คือวิธีการจัดกลุ่มภาพประเภทนี้และปฏิบัติตามการใช้งานในซอฟต์แวร์การตรวจจับระยะไกล ตัวอย่างที่ชัดเจนและเกี่ยวข้องคือการใช้งาน isocluster ใน ArcGIS ( desktop.arcgis.com/en/arcmap/10.3/tools/spatial-analyst-toolbox/… )
Jeffrey Evans

จากนั้นอันเดอร์นี้ก็ไม่ได้ช่วยอะไรเลย ปัญหาของฉันคือฉันพยายามทำการตรวจจับการเปลี่ยนแปลงเมื่อเวลาผ่านไปตามการจัดประเภทรูปภาพที่ไม่ได้รับอนุญาตจำนวนมาก แต่ฉันสามารถเปรียบเทียบผลลัพธ์ที่แตกต่างกันได้เนื่องจากชั้นเรียนได้รับมอบหมายแตกต่างกัน
ไอริส

การจำแนกประเภทที่ไม่ได้รับการสำรองไม่ใช่วิธีที่ปฏิบัติได้ในการตรวจจับการเปลี่ยนแปลง แม้แต่ความแตกต่างเล็กน้อยในภาพที่กำหนดอาจจบลงด้วยการกำหนดพิกเซลให้กับชั้นเรียนอื่น กรณีนี้จะเกิดขึ้นแม้ว่าคุณจะจัดเตรียมศูนย์คลัสเตอร์สำหรับ K-Means ฉันมีฟังก์ชั่นเอนโทรปีในแพ็คเกจ spatialEco ที่มีประโยชน์สำหรับการตรวจจับการเปลี่ยนแปลง คุณคำนวณเอนโทรปีภายในหน้าต่าง NxN และรับ delta ในแต่ละขั้นตอน เอนโทรปีเชิงลบหมายถึงการสูญเสียและบวกคือกำไรขององค์ประกอบภูมิทัศน์ภายในขนาดที่กำหนดภายใต้เอนโทรปี
Jeffrey Evans

นั่นเป็นคำถามเก่าและฉันได้ค้นพบความคิดในการใช้อายุ k- หมายถึงที่ผ่านมา แต่ดีที่จะรู้แพคเกจ spatialEco สำหรับครั้งต่อไป;)
ไอริส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.