ข้อมูลเบื้องต้นเกี่ยวกับการทำความเข้าใจ kmean ด้วยการนำไปใช้งานใน R และการเลือก K ที่ดีที่สุด

อัลกอริธึมการจัดกลุ่มใน Machine Learning เป็นเทคนิคที่ไม่ได้รับการดูแล (ซึ่งมีข้อมูลอินพุตโดยไม่มีการตอบกลับที่มีป้ายกำกับ) วัตถุประสงค์ของพวกเขาคือการวาดรูปแบบข้อมูลและการสังเกตข้อมูลคลัสเตอร์เป็นกลุ่มต่างๆ ตามความคล้ายคลึงกัน การจัดกลุ่ม K-Means เป็นวิธีหนึ่งในการนำอัลกอริธึมการจัดกลุ่มไปใช้ซึ่งสามารถสรุปข้อมูลที่มีมิติสูงได้สำเร็จ

การแบ่งกลุ่มแบบเคมีนแบบ K จะแบ่งกลุ่มของการสังเกตออกเป็นคลัสเตอร์จำนวนคงที่ซึ่งได้รับการระบุตั้งแต่แรกตามคุณลักษณะที่คล้ายคลึงกัน

อย่างไรก็ตาม คำถามเกิดขึ้นจากการสังเกตแบบกลุ่ม:

1) การที่สิ่งต่างๆ มีความคล้ายคลึงกันหมายความว่าอย่างไร?

2) เราจะทราบได้อย่างไรว่าสิ่งต่าง ๆ ใกล้พอที่จะจัดกลุ่มเข้าด้วยกัน?

การตอบคำถามสองข้อนี้ การตัดสินใจเลือก K ที่ดีที่สุด การทำความเข้าใจแนวคิด K-means และการนำไปใช้กับชุดข้อมูลใน R คือขอบเขตของบล็อกโพสต์นี้

เมื่อเรากำหนด ก) จำนวนคลัสเตอร์ที่เราต้องการ ข) การเดาเบื้องต้นเพื่อวางตำแหน่งกระจุกของเรา (เซนทรอยด์) และ ค) การวัดระยะทาง เราสามารถใช้ K-means เพื่อประเมินขั้นสุดท้ายได้ ของคลัสเตอร์เซนทรอยด์และการกำหนดการสังเกตของเซนทรอยด์แต่ละครั้ง

การทำความเข้าใจอัลกอริทึม:

เพื่อความสะดวกในการทำความเข้าใจ สมมติว่าเรามีชุดข้อมูลที่มีการสังเกตทั้งหมด 10 รายการ เมื่อดูข้อมูลแล้ว เราสามารถสรุปได้ว่าข้อมูลสามารถจัดกลุ่มออกเป็น 3 กลุ่มได้อย่างง่ายดาย ดังนั้นเราจึงดำเนินการในส่วนนี้

ขั้นแรก เราเลือกจำนวนคลัสเตอร์ที่เราต้องการจัดหมวดหมู่ข้อมูลของเรา (นั่นคือ K ใน K-means) ที่นี่ มาตัดสินใจกันว่า K = 3 เนื่องจากสามารถอนุมานได้ด้วยสายตา เราจะพูดถึงวิธีการทางเทคนิคในการตัดสินใจเลือก K ในอีกสักครู่

ขั้นตอนต่อไปคือการสุ่มเลือกจุดข้อมูลเริ่มต้นที่แตกต่างกันสามจุดซึ่งทำหน้าที่เป็นกระจุกของเราหรือ "เซนทรอยด์" บนกราฟของเรา ดังที่แสดงโดยสามเหลี่ยมสีในกราฟด้านล่าง จากนั้นเราจะวัดระยะห่างระหว่างจุดข้อมูล '1' และจุดข้อมูล 3 จุด และกำหนดสีของจุดข้อมูลที่ใกล้ที่สุด สิ่งนี้จะทำซ้ำจนกว่าจะกำหนดจุดข้อมูลทั้งหมดให้กับเซนทรอยด์แห่งใดแห่งหนึ่ง

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

นี่คือวิธีที่ K-means แบ่งชุดข้อมูลของเราออกเป็นกลุ่มตามจำนวนที่ระบุตามการวัดระยะทาง หน่วยวัดระยะทางที่เราใช้ในแปลงสองมิติคือระยะทางแบบยุคลิด (รากที่สองของ (x² + y²))

การใช้ K-mean ใน R:

ขั้นตอนที่ 1: การติดตั้งแพ็คเกจที่เกี่ยวข้องและการเรียกไลบรารี่

install.packages("dplyr")
install.packages("ggplot2")
install.packages("ggfortify")
library("ggplot2")
library("dplyr")
library("ggfortify")

ขั้นตอนที่ 2: การโหลดและทำความเข้าใจชุดข้อมูล

ไอริสเป็นชุดข้อมูลในตัวที่มาในรูปแบบ R ซึ่งมีการสังเกตดอกไม้ 150 ครั้งจากไอริส 3 สายพันธุ์ที่แตกต่างกัน (Iris setosa, versicolor และ virginica) เราจะใช้สิ่งนี้สำหรับการทดสอบอัลกอริทึมของเรา

summary(iris)
head(iris)

ขั้นตอนที่ 3: การกำจัดตัวแปรเป้าหมาย

เนื่องจากการจัดหมวดหมู่ของการสังเกตได้ดำเนินการไปแล้วในชุดข้อมูลนี้ เราจึงต้องลบตัวแปรเป้าหมายออกจากโค้ดของเรา เนื่องจากเราต้องการให้อัลกอริทึมของเราสามารถทำได้เอง สำหรับสิ่งนี้ ฉันจะโหลดม่านตาสี่คอลัมน์แรกลงใน 'data' ของ data-frame ของฉัน

data <- select(iris, c(1:4))

จะทราบได้อย่างไรว่าจะใช้ค่าใดสำหรับ K

ขั้นตอนที่ 4: เทคนิคการเหยียดศอก

แม้ว่าจะมีหลายวิธีในการตัดสินใจเลือกจำนวนกลุ่ม แต่ วิธีจุดศอก (แม้จะไม่แม่นยำมากนัก แล้วเราจะมาดูว่าทำไม) ก็มีการใช้กันอย่างแพร่หลาย แนวคิดคือการประเมินคุณภาพของการจัดกลุ่มโดยเพิ่มการเปลี่ยนแปลงภายในแต่ละคลัสเตอร์ (ติดตามสิ่งนี้และเริ่มต้นใหม่อีกครั้งด้วยจุดเริ่มต้นที่แตกต่างกัน) พารามิเตอร์ที่มีค่าความแปรปรวนน้อยที่สุดจะชนะ วิธีจุดศอกจะพล็อตค่าความแปรผันที่ลดลงเทียบกับไม่มีคลัสเตอร์ (K) และจุดศอกซึ่งเป็นตัวเลขของ K หลังจากนั้นความแปรผันจะไม่สูงชันมากนัก ถือเป็นค่า K ที่ดีที่สุดของเรา

เราไม่มีฟังก์ชันในตัวสำหรับวัดระดับความแปรปรวนในการสังเกตของเรา อย่างไรก็ตาม มีเอกสารประกอบของ Rpubs ที่สร้างฟังก์ชันของ wssplot (ภายในกลุ่ม Sum of Squares Plot) เพื่อให้เราใช้วิธี Elbow point ของเรา

wssplot <- function(data, nc=15, seed=1234){
  wss <- (nrow(data)-1)*sum(apply(data,2,var))
  for (i in 2:nc){
    set.seed(seed)
    wss[i] <- sum(kmeans(data, centers=i)$withinss)}
  plot(1:nc, wss, type="b", xlab="Number of Clusters",
       ylab="Within groups sum of squares")
  wss
}

โครงเรื่องแสดงขอบคมที่ K = 2 ซึ่งบ่งชี้ว่าจำนวนคลัสเตอร์ที่เหมาะสมที่สุดสำหรับชุดข้อมูลของเราคือ 2

ขั้นตอนที่ 5: การใช้ K-mean

เรียบง่ายอย่างที่เห็น kmeans() เพียงแค่ต้องการให้เราป้อนข้อมูล dataframe ของเราและระบุ K ให้ทำงานด้วย

kmean <- kmeans(data, 2)
kmean$centers

kmean$clusters จะส่งกลับเวกเตอร์ของตัวเลขตั้งแต่ 1 ถึง 2 ซึ่งแสดงให้เห็นว่าการสังเกตใดเป็นของคลัสเตอร์ 1 และคลัสเตอร์ 2 kmean$centers ส่งคืนตำแหน่งของแต่ละเซนทรอยด์ สำหรับเช่น คลัสเตอร์ 1 มีค่าเฉลี่ย Sepal.Length = 5.00, Sepal.width = 3.36, Petal.Length = 1.56 และ Petal.width = 0.29

ขั้นตอนที่ 6: การวางแผนจุดข้อมูลของเราในกลุ่ม

แม้ว่าโครงเรื่องนี้จะดูดีมากและได้จัดกลุ่มการสังเกตของเราออกเป็น 2 กลุ่มอย่างชัดเจน แต่เรารู้แล้วว่าชุดข้อมูลของเรามีทั้งหมด 3 กลุ่ม เทคนิคจุดศอกของเราไม่ได้แม่นยำทั้งหมดในการให้ K ที่ถูกต้องแก่เรา ดังนั้น ตามหลักการทั่วไป ควรวนซ้ำระหว่างค่า K รอบจุดศอกและตัดสินใจเลือกแนวทางปฏิบัติที่ดีที่สุดด้วยตัวเราเอง

autoplot(kmean, data, frame = TRUE)

ขั้นตอนที่ 7: Kmean โดย K = 3

เนื่องจากเราได้ตัดสินใจเปลี่ยน K และดูรูปแบบข้อมูล เรามาดูกันว่าผลลัพธ์จะเปลี่ยนไปอย่างไร

kmean <- kmeans(data, 3)
kmean$centers

ขั้นตอนที่ 8: พล็อตกราฟคลัสเตอร์ใหม่

เราเห็นว่า kmean$clusters ได้แบ่งการสังเกตออกเป็นสามกลุ่มอย่างไรในขณะนี้ และ kmean$centers ได้อัปเดตค่าเซนทรอยด์ด้วยเช่นกัน โครงเรื่องด้านล่างแสดงการจัดกลุ่มตาม 3 คลัสเตอร์ ขอย้ำอีกครั้งว่าข้อกำหนด K นั้นขึ้นอยู่กับเรา เทคนิคการหาค่า K สามารถให้ค่าประมาณที่ดีแก่เราในการทำงานด้วย

K-means เป็นเทคนิค Machine Learning ที่มีประสิทธิภาพซึ่ง:

  • ง่ายต่อการติดตั้งและใช้งาน
  • มีการตีความได้ดีมาก
  • สร้างคลัสเตอร์ที่แน่นกว่าการจัดกลุ่มแบบลำดับชั้น
  • มีความรวดเร็วในการคำนวณ

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