ข้อมูลเบื้องต้นเกี่ยวกับการทำความเข้าใจ 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 และเน้นย้ำถึงข้อดีและข้อเสียบางประการ