K หมายถึง Clusterการเขียนโปรแกรมด้วยภาษา R พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
K- หมายถึง Clusterการจัดกลุ่มข้อมูลใน R ทำได้โดยการลดระยะห่างระหว่างแต่ละจุดกับจุดศูนย์กลางของกลุ่มให้เหลือน้อยที่สุด ขั้นตอนการทำงานนี้จะทำการปรับมาตรฐานชุดข้อมูลราคาคอมพิวเตอร์ แสดงภาพเคลื่อนไหวของอัลกอริทึม ค้นหาค่า k ที่เหมาะสมที่สุดด้วยวิธี Elbow และอ่านกลุ่มต่างๆ ผ่านแผนที่ความร้อน

ความหมายของ Cluster การวิเคราะห์?
Cluster การวิเคราะห์เป็นของ การเรียนรู้โดยไม่ได้รับการดูแลคลัสเตอร์คือกลุ่มข้อมูลที่มีคุณลักษณะคล้ายคลึงกัน เราสามารถพูดได้ว่าการวิเคราะห์คลัสเตอร์เป็นเรื่องเกี่ยวกับการค้นพบมากกว่าการคาดการณ์ เครื่องจะค้นหาความคล้ายคลึงในข้อมูล ตัวอย่างเช่น คุณสามารถใช้การวิเคราะห์คลัสเตอร์สำหรับแอปพลิเคชันต่อไปนี้:
- การแบ่งส่วนลูกค้า: ค้นหาความคล้ายคลึงกันระหว่างกลุ่มลูกค้า
- การรวมกลุ่มตลาดหุ้น: จัดกลุ่มหุ้นตามผลงาน
- ลดมิติของชุดข้อมูลโดยการจัดกลุ่มping การสังเกตที่มีค่าใกล้เคียงกัน
Clusterการวิเคราะห์ไม่ใช่เรื่องยากเกินไปที่จะนำไปใช้และมีความหมายและนำไปใช้ได้จริงสำหรับธุรกิจด้วย
ความแตกต่างที่ชัดเจนที่สุดระหว่างการเรียนรู้แบบมีผู้สอนและแบบไม่มีผู้ดูแลอยู่ที่ผลลัพธ์ การเรียนรู้แบบมีผู้สอนจะสร้างตัวแปรใหม่ที่เรียกว่าฉลาก ในขณะที่การเรียนรู้แบบมีผู้สอนจะทำนายผลลัพธ์ เครื่องจักรช่วยให้ผู้ปฏิบัติงานสามารถติดป้ายกำกับข้อมูลตามความสัมพันธ์ที่ใกล้ชิดได้ ขึ้นอยู่กับนักวิเคราะห์ว่าจะใช้ประโยชน์จากกลุ่มและตั้งชื่อกลุ่มเหล่านั้นอย่างไร
มาดูตัวอย่างเพื่อทำความเข้าใจแนวคิดของการจัดกลุ่มข้อมูล เพื่อความเรียบง่าย เราทำงานแบบสองมิติ คุณมีข้อมูลเกี่ยวกับค่าใช้จ่ายทั้งหมดของลูกค้าและอายุของพวกเขา เพื่อปรับปรุงการโฆษณา ทีมการตลาดต้องการส่งอีเมลที่ตรงเป้าหมายมากขึ้นถึงลูกค้าของพวกเขา
ในกราฟต่อไปนี้ คุณจะแสดงค่าใช้จ่ายทั้งหมดและอายุของลูกค้า
library(ggplot2) df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54), spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24) ) ggplot(df, aes(x = age, y = spend)) + geom_point()
จุดนี้มองเห็นลวดลายได้
- ด้านซ้ายล่างจะมองเห็นกลุ่มวัยรุ่นที่มีกำลังซื้อต่ำกว่า
- ระดับกลางตอนบนสะท้อนถึงคนที่มีงานที่สามารถใช้จ่ายได้มากขึ้น
- สุดท้ายคือผู้สูงอายุที่มีงบประมาณต่ำกว่า
ในรูปด้านบน คุณจัดกลุ่มการสังเกตด้วยมือและกำหนดแต่ละกลุ่มทั้งสามกลุ่ม ตัวอย่างนี้ค่อนข้างตรงไปตรงมาและมองเห็นได้ชัดเจน หากมีการผนวกการสังเกตใหม่เข้ากับชุดข้อมูล คุณสามารถติดป้ายกำกับการสังเกตเหล่านั้นภายในวงกลมได้ คุณสามารถกำหนดวงกลมตามการตัดสินของเรา แทนที่จะทำเช่นนั้น คุณสามารถใช้ เครื่องเรียนรู้ เพื่อจัดกลุ่มข้อมูลอย่างเป็นกลาง
ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีการใช้งาน k- หมายถึง ขั้นตอนวิธี
อัลกอริทึม K-Means
K-means เป็นวิธีการจัดกลุ่มที่ใช้กันอย่างแพร่หลายที่สุด อัลกอริทึมนี้มีมาตั้งแต่ทศวรรษ 1950 และได้รับการปรับปรุงแก้ไขมาหลายครั้งนับตั้งแต่นั้นมา
อัลกอริทึมพยายามค้นหากลุ่มโดยการลดระยะห่างระหว่างการสังเกตที่เรียกว่า ท้องถิ่นที่เหมาะสมที่สุด วิธีแก้ปัญหา ระยะทางจะวัดจากพิกัดของการสังเกต ตัวอย่างเช่น ในพื้นที่สองมิติ พิกัดก็คือ x และ y เท่านั้น
อัลกอริทึมทำงานดังนี้:
- ขั้นตอนที่ 1: เลือกจุดศูนย์กลางเริ่มต้น k จุดแบบสุ่มในพื้นที่คุณลักษณะ
- ขั้นตอนที่ 2: กำหนดให้ข้อมูลสังเกตการณ์แต่ละรายการอยู่ในกลุ่มศูนย์กลางที่ใกล้ที่สุด เซนทรอยด์. ซึ่งจะทำให้เกิดกลุ่ม k กลุ่ม
- ขั้นตอนที่ 3: Shift เซนทรอยด์เริ่มต้นถึงค่าเฉลี่ยของพิกัดภายในกลุ่ม
- ขั้นตอนที่ 4: ลดระยะห่างให้เหลือน้อยที่สุดตามเซนทรอยด์ใหม่ มีการสร้างขอบเขตใหม่ ดังนั้นการสังเกตจะย้ายจากกลุ่มหนึ่งไปอีกกลุ่มหนึ่ง
- ทำซ้ำจนกว่าจะไม่มีการเปลี่ยนแปลงกลุ่มการสังเกต
โดยปกติแล้ว K-means จะวัดระยะทางแบบยุคลิดระหว่างค่าสังเกตสองค่า x และ y:
นอกจากนี้ยังมีวิธีการวัดระยะทางอื่นๆ เช่น ระยะทางแมนฮัตตันหรือระยะทางมินคอฟสกี โปรดทราบว่า อัลกอริธึม K-mean จะให้กลุ่มที่แตกต่างกันในแต่ละครั้งที่เรียกใช้อัลกอริธึม จำไว้ว่าค่าเริ่มต้นแรกๆ นั้นเป็นแบบสุ่ม และจะคำนวณระยะทางไปเรื่อยๆ จนกว่าอัลกอริธึมจะให้ผลลัพธ์ที่สม่ำเสมอภายในกลุ่ม กล่าวคือ K-mean มีความไวต่อการเลือกค่าเริ่มต้นมาก และเว้นแต่ว่าจำนวนข้อมูลและกลุ่มจะมีขนาดเล็ก ก็แทบเป็นไปไม่ได้เลยที่จะได้ผลลัพธ์การจัดกลุ่มแบบเดิมซ้ำอีก
การเลือกจำนวนคลัสเตอร์
อีกหนึ่งปัญหาที่พบในการจัดกลุ่มแบบ k-mean คือการเลือกจำนวนกลุ่ม คุณสามารถกำหนดค่า k ให้สูง ซึ่งหมายถึงจำนวนกลุ่มที่มาก เพื่อปรับปรุงความสม่ำเสมอภายในกลุ่ม แต่คุณก็มีความเสี่ยงเช่นกัน ฟิตเกินไป ข้อมูล การเกิดภาวะโอเวอร์ฟิตติ้งหมายความว่าประสิทธิภาพลดลงอย่างมากเมื่อใช้กับข้อมูลใหม่ เนื่องจากแบบจำลองจดจำสัญญาณรบกวนในตัวอย่างนี้มากกว่ารูปแบบพื้นฐานที่แท้จริง
จำนวนคลัสเตอร์ขึ้นอยู่กับลักษณะของชุดข้อมูล อุตสาหกรรม ธุรกิจ และอื่นๆ อย่างไรก็ตาม มีกฎเกณฑ์ง่ายๆ ในการเลือกจำนวนคลัสเตอร์ที่เหมาะสม:
โดยที่ n คือจำนวนข้อมูลในชุดข้อมูล
ในทางปฏิบัติ การใช้เวลาค้นหาค่า k ที่เหมาะสมที่สุดกับความต้องการทางธุรกิจนั้นคุ้มค่า
เราจะใช้ชุดข้อมูลราคาเครื่องคอมพิวเตอร์ส่วนบุคคลเพื่อทำการวิเคราะห์การจัดกลุ่ม ชุดข้อมูลนี้ประกอบด้วยข้อมูลสังเกต 6259 รายการและคุณลักษณะ 10 ประการ ชุดข้อมูลนี้สังเกตราคาตั้งแต่ปี 1993 ถึง 1995 ของคอมพิวเตอร์ส่วนบุคคล 486 เครื่องในสหรัฐอเมริกา ตัวแปรได้แก่ ราคา ความเร็ว แรม หน้าจอ ซีดี เป็นต้น
คุณจะดำเนินการดังต่อไปนี้:
- นำเข้าข้อมูล
- ฝึกโมเดล
- ประเมินแบบจำลอง
นำเข้าข้อมูล
K-means ไม่เหมาะสำหรับตัวแปรประเภทแฟคเตอร์ เพราะมันทำงานกับระยะทาง และป้ายกำกับแบบไม่ต่อเนื่องไม่มีระยะทางที่มีความหมายระหว่างกัน ลบสามคอลัมน์ที่เป็นหมวดหมู่ (cd, multi, premium) พร้อมกับดัชนีแถว X ชุดข้อมูลนี้ไม่มีค่าที่หายไป
library(dplyr) PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv" df <- read.csv(PATH) %>% select(-c(X, cd, multi, premium)) glimpse(df)
เอาท์พุต
## Observations: 6,259 ## Variables: 7 ## $ price <int> 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2... ## $ speed <int> 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25, ... ## $ hd <int> 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210... ## $ ram <int> 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4, ... ## $ screen <int> 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, ... ## $ ads <int> 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, ... ## $ trend <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
จากสถิติสรุป คุณจะเห็นว่าข้อมูลมีค่ามาก วิธีปฏิบัติที่ดีก่อนที่จะใช้วิธีการคำนวณระยะทางใดๆ คือการปรับมาตรฐานข้อมูลเพื่อให้ตัวแปรทุกตัวมีค่าเท่ากัน ค่าเฉลี่ยเป็นศูนย์และส่วนเบี่ยงเบนมาตรฐานเป็นหนึ่งหากไม่มีสิ่งนี้ ราคาซึ่งมีมูลค่าหลายพันดอลลาร์จะเป็นปัจจัยหลักในการคำนวณระยะทาง และขนาดหน้าจอจะแทบไม่มีผลอะไรเลย
summary(df)
Output:
## price speed hd ram ## Min. : 949 Min. : 25.00 Min. : 80.0 Min. : 2.000 ## 1st Qu.:1794 1st Qu.: 33.00 1st Qu.: 214.0 1st Qu.: 4.000 ## Median :2144 Median : 50.00 Median : 340.0 Median : 8.000 ## Mean :2220 Mean : 52.01 Mean : 416.6 Mean : 8.287 ## 3rd Qu.:2595 3rd Qu.: 66.00 3rd Qu.: 528.0 3rd Qu.: 8.000 ## Max. :5399 Max. :100.00 Max. :2100.0 Max. :32.000 ## screen ads trend ## Min. :14.00 Min. : 39.0 Min. : 1.00 ## 1st Qu.:14.00 1st Qu.:162.5 1st Qu.:10.00 ## Median :14.00 Median :246.0 Median :16.00 ## Mean :14.61 Mean :221.3 Mean :15.93 ## 3rd Qu.:15.00 3rd Qu.:275.0 3rd Qu.:21.50 ## Max. :17.00 Max. :339.0 Max. :35.00
คุณรีสเกลตัวแปรด้วยฟังก์ชัน scale() ของไลบรารี dplyr การเปลี่ยนแปลงจะช่วยลดผลกระทบของค่าผิดปกติและช่วยให้สามารถเปรียบเทียบการสังเกตเพียงอย่างเดียวกับค่าเฉลี่ยได้ หากเป็นค่ามาตรฐาน (หรือ คะแนน z) อยู่ในระดับสูง คุณสามารถมั่นใจได้ว่าการสังเกตนี้อยู่เหนือค่าเฉลี่ยจริงๆ (คะแนน z ขนาดใหญ่แสดงว่าจุดนี้อยู่ห่างจากค่าเฉลี่ยในรูปของส่วนเบี่ยงเบนมาตรฐาน คะแนน z เท่ากับ 2 แสดงว่าค่าเป็น XNUMX มาตรฐาน การเบี่ยงเบนไปจากค่าเฉลี่ย หมายเหตุ คะแนน z เป็นไปตามการแจกแจงแบบเกาส์เซียนและมีความสมมาตรรอบๆ ค่าเฉลี่ย
# Note: speed is deliberately left out of the scaled data frame rescale_df <- df %>% mutate(price_scal = scale(price), hd_scal = scale(hd), ram_scal = scale(ram), screen_scal = scale(screen), ads_scal = scale(ads), trend_scal = scale(trend)) %>% select(-c(price, speed, hd, ram, screen, ads, trend))
ฐาน R มีฟังก์ชันเรียกใช้อัลกอริทึมค่าเฉลี่ย k ฟังก์ชันพื้นฐานของค่าเฉลี่ย k คือ:
kmeans(df, k) arguments: -df: dataset used to run the algorithm -k: Number of clusters
ฝึกโมเดล
ในรูปที่สาม คุณได้อธิบายรายละเอียดวิธีการทำงานของอัลกอริธึม คุณสามารถดูแต่ละขั้นตอนได้ในรูปแบบกราฟิกด้วยแพ็กเกจแอนิเมชันที่เขียนโดย Yihui Xie ซึ่งเป็นผู้สร้าง knitr สำหรับ R Markdown ด้วย แพ็กเกจนี้ไม่ได้อยู่ในช่องทาง conda ดังนั้นให้ติดตั้งจาก CRAN:
install.packages("animation")
หลังจากที่คุณโหลดไลบรารี่แล้ว ให้เพิ่ม .ani หลัง kmeans และ R จะวางแผนขั้นตอนทั้งหมด เพื่อเป็นการแสดงตัวอย่าง คุณจะรันอัลกอริทึมด้วยตัวแปรที่ปรับขนาดใหม่ hd และ ram ด้วยคลัสเตอร์สามคลัสเตอร์เท่านั้น
set.seed(2345) library(animation) kmeans.ani(rescale_df[2:3], 3)
Code คำอธิบาย
- kmeans.ani(rescale_df[2:3], 3): เลือกคอลัมน์ 2 และ 3 ของชุดข้อมูล rescale_df และรันอัลกอริทึมโดยตั้งค่า k เป็น 3 พล็อตแอนิเมชั่น
คุณสามารถตีความภาพเคลื่อนไหวได้ดังนี้:
- ขั้นตอนที่ 1: R สุ่มเลือกสามคะแนน
- ขั้นตอนที่ 2: คำนวณระยะทางแบบยุคลิดและวาดกลุ่มสี คุณมีกลุ่มสีหนึ่งเป็นสีเขียวที่ด้านล่างซ้าย กลุ่มสีหนึ่งเป็นสีดำที่ด้านขวา และกลุ่มสีหนึ่งเป็นสีแดงระหว่างกลุ่มสีทั้งสอง
- ขั้นตอนที่ 3: คำนวณจุดศูนย์กลางหรือค่าเฉลี่ยของกลุ่ม
- ทำซ้ำจนกว่าจะไม่มีการเปลี่ยนแปลงข้อมูลคลัสเตอร์
อัลกอริทึมจะบรรจบกันหลังจากทำซ้ำ 7 ครั้ง คุณสามารถเรียกใช้อัลกอริทึม k-mean ในชุดข้อมูลของเราด้วยคลัสเตอร์ 5 คลัสเตอร์และเรียกมันว่า pc_cluster
pc_cluster <-kmeans(rescale_df, 5)
รายการ pc_cluster ประกอบด้วยองค์ประกอบที่มีประโยชน์เจ็ดอย่าง:
- pc_cluster$cluster: กลุ่มข้อมูลที่กำหนดให้กับแต่ละการสังเกต
- pc_cluster$centers: ศูนย์กลางคลัสเตอร์
- pc_cluster$totss: ผลรวมของกำลังสองทั้งหมด
- pc_cluster$withinss: ผลรวมกำลังสองภายในกลุ่ม โดยแต่ละกลุ่มมีค่าเดียว
- pc_cluster$tot.withinss: ผลรวมของ withinss
- pc_cluster$betweenss: ผลรวมกำลังสองทั้งหมด ลบด้วยผลรวมกำลังสองภายในกลุ่ม
- pc_cluster$size: จำนวนการสังเกตภายในแต่ละคลัสเตอร์
คุณจะใช้ผลรวมของผลรวมของกำลังสองภายใน (เช่น tot.withinss) เพื่อคำนวณจำนวนคลัสเตอร์ k ที่เหมาะสม การหาค่า k นั้นเป็นงานที่สำคัญมาก
วิธีการค้นหาค่า k ที่เหมาะสมที่สุดด้วยวิธีข้อศอก
เทคนิคหนึ่งในการเลือก k ที่ดีที่สุดเรียกว่า วิธีข้อศอกวิธีนี้ใช้ความเป็นเนื้อเดียวกันภายในกลุ่มหรือความไม่เป็นเนื้อเดียวกันภายในกลุ่มเพื่อประเมินความแปรปรวน กล่าวอีกนัยหนึ่ง คุณสนใจเปอร์เซ็นต์ของความแปรปรวนที่อธิบายโดยแต่ละคลัสเตอร์ คุณสามารถคาดหวังว่าความแปรปรวนจะเพิ่มขึ้นตามจำนวนคลัสเตอร์ หรืออีกทางหนึ่ง ความไม่เป็นเนื้อเดียวกันจะลดลง ความท้าทายของเราคือการค้นหาค่า k ที่อยู่เหนือผลตอบแทนที่ลดลง การเพิ่มคลัสเตอร์ใหม่ไม่ได้ปรับปรุงความแปรปรวนในข้อมูล เนื่องจากมีข้อมูลเหลือให้อธิบายน้อยมาก
ในบทช่วยสอนนี้ เราจะค้นหาจุดนี้โดยใช้การวัดความไม่เป็นเนื้อเดียวกัน ผลรวมภายในคลัสเตอร์ของผลรวมกำลังสองคือค่า tot.withinss ในรายการส่งคืนโดย kmean()
คุณสามารถสร้างกราฟข้อศอกและหาค่า k ที่เหมาะสมได้ดังนี้:
- ขั้นตอนที่ 1: สร้างฟังก์ชันเพื่อคำนวณผลรวมของกำลังสองภายในคลัสเตอร์
- ขั้นตอนที่ 2: รันอัลกอริทึมกับค่า k ต่างๆ
- ขั้นตอนที่ 3: สร้างกรอบข้อมูลพร้อมผลลัพธ์ของอัลกอริทึม
- ขั้นตอนที่ 4: พล็อตผลลัพธ์
ขั้นตอน 1) สร้างฟังก์ชันเพื่อคำนวณผลรวมภายในกลุ่มของผลรวมกำลังสอง
คุณสร้างฟังก์ชันที่รันอัลกอริทึม k-mean และจัดเก็บผลรวมภายในคลัสเตอร์ผลรวมของกำลังสอง
kmean_withinss <- function(k) { cluster <- kmeans(rescale_df, k) return (cluster$tot.withinss) }
Code คำอธิบาย
- ฟังก์ชั่น (k): กำหนดจำนวนข้อโต้แย้งในฟังก์ชั่น
- kmeans(rescale_df, k): รันอัลกอริทึมสำหรับค่า k นี้
- return(cluster$tot.withinss): จัดเก็บผลรวมภายในกลุ่มผลรวมของกำลังสอง
ทดสอบฟังก์ชันโดยกำหนดค่า k เท่ากับ 2
Output:
## Try with 2 cluster
kmean_withinss(2)
Output:
## [1] 27087.07
ขั้นตอน 2) รันอัลกอริทึม n ครั้ง
คุณจะใช้ฟังก์ชัน sapply() เพื่อรันอัลกอริทึมในช่วง k เทคนิคนี้เร็วกว่าการสร้างลูปและเก็บค่า
# Set maximum cluster max_k <-20 # Run algorithm over a range of k wss <- sapply(2:max_k, kmean_withinss)
Code คำอธิบาย
- max_k <- 20: กำหนดค่าสูงสุดของ k เป็น 20
- sapply(2:max_k, kmean_withinss): เรียกใช้ฟังก์ชัน kmean_withinss() ในช่วง 2:max_k เช่น 2 ถึง 20
ขั้นตอน 3) สร้างกรอบข้อมูลพร้อมผลลัพธ์ของอัลกอริทึม
เมื่อเขียนและทดสอบฟังก์ชันเสร็จแล้ว ให้เรียกใช้ฟังก์ชันนั้นในช่วง 2 ถึง 20 และบันทึกค่า tot.withinss ทุกค่า
# Create a data frame to plot the graph elbow <-data.frame(2:max_k, wss)
Code คำอธิบาย
- data.frame(2:max_k, wss): สร้าง data frame พร้อมเอาต์พุตของอัลกอริทึมที่จัดเก็บใน wss
ขั้นตอน 4) พล็อตผลลัพธ์
คุณวาดกราฟเพื่อให้เห็นภาพว่าจุดศอกอยู่ที่ไหน
# Plot the graph with gglop ggplot(elbow, aes(x = X2.max_k, y = wss)) + geom_point() + geom_line() + scale_x_continuous(breaks = seq(1, 20, by = 1))
จากกราฟ คุณจะเห็นว่าค่า k ที่เหมาะสมที่สุดคือ 7 โดยที่เส้นโค้งเริ่มมีผลตอบแทนลดลง
เมื่อคุณมีค่า k ที่เหมาะสมที่สุดแล้ว คุณจะรันอัลกอริทึมอีกครั้งโดยให้ k เท่ากับ 7 และประเมินคลัสเตอร์
การตรวจสอบกลุ่มคลัสเตอร์
pc_cluster_2 <-kmeans(rescale_df, 7)
ดังที่ได้กล่าวไปแล้ว คุณสามารถเข้าถึงข้อมูลที่น่าสนใจที่เหลืออยู่ในรายการที่ส่งคืนโดย kmean()
pc_cluster_2$cluster pc_cluster_2$centers pc_cluster_2$size
การประเมินผลเป็นเรื่องส่วนตัวและขึ้นอยู่กับวัตถุประสงค์ของการจัดกลุ่ม เป้าหมายในที่นี้คือการจัดกลุ่มคอมพิวเตอร์ที่มีคุณสมบัติคล้ายคลึงกัน ผู้เชี่ยวชาญในสาขานั้น ๆ อาจทำได้ด้วยตนเอง แต่กระบวนการจะช้าและมีโอกาสผิดพลาดสูง K-means จะทำการจัดกลุ่มให้ping โดยพิจารณาอย่างเป็นกลางและปล่อยให้ผู้เชี่ยวชาญตีความและตั้งชื่อผลลัพธ์นั้น
ในการประเมินเบื้องต้น คุณสามารถตรวจสอบขนาดของคลัสเตอร์ได้
pc_cluster_2$size
Output:
## [1] 608 1596 1231 580 1003 699 542
กลุ่มคลัสเตอร์ที่ใหญ่ที่สุด หมายเลข 2 มีข้อมูล 1,596 รายการ ในขณะที่กลุ่มคลัสเตอร์ที่เล็กที่สุด หมายเลข 7 มีคอมพิวเตอร์เพียง 542 เครื่อง การกระจายตัวของกลุ่มคลัสเตอร์ให้มีความสม่ำเสมออาจเป็นเรื่องดี หากไม่เป็นเช่นนั้น อาจจำเป็นต้องปรับปรุงการเตรียมข้อมูลให้ละเอียดขึ้น
คุณจะได้รับข้อมูลเชิงลึกมากขึ้นด้วยส่วนประกอบตรงกลาง แถวหมายถึงหมายเลขของกลุ่ม และคอลัมน์หมายถึงตัวแปรที่ใช้โดยอัลกอริทึม ค่าคือคะแนนเฉลี่ยของแต่ละกลุ่มสำหรับคอลัมน์ที่สนใจ การทำให้เป็นมาตรฐานทำให้การตีความง่ายขึ้น ค่าบวกแสดงว่าค่า z-score สำหรับกลุ่มที่กำหนดนั้นสูงกว่าค่าเฉลี่ยโดยรวม ตัวอย่างเช่น กลุ่มที่ 4 มีราคาเฉลี่ยสูงสุด (price_scal = 1.09) ในขณะที่กลุ่มที่ 5 มีราคาเฉลี่ยต่ำสุด (-0.82)
center <-pc_cluster_2$centers center
Output:
## price_scal hd_scal ram_scal screen_scal ads_scal trend_scal ## 1 -0.6372457 -0.7097995 -0.691520682 -0.4401632 0.6780366 -0.3379751 ## 2 -0.1323863 0.6299541 0.004786730 2.6419582 -0.8894946 1.2673184 ## 3 0.8745816 0.2574164 0.513105797 -0.2003237 0.6734261 -0.3300536 ## 4 1.0912296 -0.2401936 0.006526723 2.6419582 0.4704301 -0.4132057 ## 5 -0.8155183 0.2814882 -0.307621003 -0.3205176 -0.9052979 1.2177279 ## 6 0.8830191 2.1019454 2.168706085 0.4492922 -0.9035248 1.2069855 ## 7 0.2215678 -0.7132577 -0.318050275 -0.3878782 -1.3206229 -1.5490909
คุณสามารถสร้างแผนที่ความร้อนด้วย ggplot เพื่อช่วยเราเน้นความแตกต่างระหว่างหมวดหมู่ต่างๆ
จำเป็นต้องเปลี่ยนสีเริ่มต้นของ ggplot ด้วยไลบรารี RColorBrewer คุณสามารถใช้คอนด้าได้ ห้องสมุด และโค้ดที่จะเปิดในเทอร์มินัล:
conda install -c r r-rcolorbrewer
หากต้องการสร้างแผนที่ความร้อน คุณต้องดำเนินการในสามขั้นตอน:
- สร้างกรอบข้อมูลด้วยค่าของศูนย์กลางและสร้างตัวแปรด้วยหมายเลขของคลัสเตอร์
- ปรับรูปร่างข้อมูลใหม่ด้วยฟังก์ชันรวบรวม() ของไลบรารีที่เป็นระเบียบเรียบร้อย คุณต้องการแปลงข้อมูลจากกว้างไปเป็นยาว
- สร้างจานสีด้วยสีRampฟังก์ชันจานสี()
ขั้นตอน 1) สร้างกรอบข้อมูล
มาสร้างชุดข้อมูลการปรับรูปร่างกันเถอะ
library(tidyr) # create dataset with the cluster number cluster <- c(1: 7) center_df <- data.frame(cluster, center) # Reshape the data center_reshape <- gather(center_df, features, values, price_scal: trend_scal) head(center_reshape)
Output:
## cluster features values ## 1 1 price_scal -0.6372457 ## 2 2 price_scal -0.1323863 ## 3 3 price_scal 0.8745816 ## 4 4 price_scal 1.0912296 ## 5 5 price_scal -0.8155183 ## 6 6 price_scal 0.8830191
ขั้นตอน 2) สร้างชุดสี
โค้ดด้านล่างนี้สร้างชุดสีที่ใช้ในแผนที่ความร้อน
library(RColorBrewer) # Create the palette hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')
ขั้นตอนที่ 3) เห็นภาพ
คุณสามารถพล็อตกราฟและดูว่ากลุ่มต่างๆ มีลักษณะอย่างไรได้
# Plot the heat map ggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) + scale_y_continuous(breaks = seq(1, 7, by = 1)) + geom_tile() + coord_equal() + scale_fill_gradientn(colours = hm.palette(90)) + theme_classic()
วิธีการสร้างผลลัพธ์ K-Means ที่ทำซ้ำได้ด้วย set.seed() และ nstart
ในคู่มือการใช้งานระบุว่าอัลกอริทึม k-means จะให้กลุ่มข้อมูลที่แตกต่างกันในแต่ละครั้งที่ใช้งาน ซึ่งไม่ใช่ลักษณะเฉพาะที่ต้องยอมรับ แต่เป็นปัญหาที่มีวิธีแก้ไขมาตรฐานสองวิธี และตัวอย่างข้างต้นก็ไม่ได้ใช้วิธีแก้ไขใดวิธีหนึ่งเลย
1. กำหนดจุดเริ่มต้นด้วย set.seed() จุดศูนย์กลางเริ่มต้นจะถูกสุ่มเลือก ดังนั้นการเรียกใช้ฟังก์ชันเดียวกันจึงสร้างคลัสเตอร์ที่แตกต่างกันในแต่ละครั้ง การกำหนดค่าเริ่มต้นจะทำให้การวิเคราะห์ทั้งหมดสามารถทำซ้ำได้:
set.seed(123)
pc_cluster_2 <- kmeans(rescale_df, 7)
2. ทำการรีสตาร์ทหลายๆ ครั้ง และเลือกอันที่ดีที่สุดโดยใช้คำสั่ง nstart การเริ่มต้นแบบสุ่มเพียงครั้งเดียวอาจนำไปสู่จุดเหมาะสมเฉพาะที่ที่ไม่ดี อาร์กิวเมนต์ nstart จะเรียกใช้อัลกอริทึมหลายครั้งตามจำนวนครั้งนั้น โดยใช้การเริ่มต้นแบบสุ่มที่แตกต่างกัน และส่งคืนค่าที่มีผลรวมของกำลังสองต่ำที่สุด:
set.seed(123)
pc_cluster_2 <- kmeans(rescale_df, centers = 7, nstart = 25)
โดยทั่วไปแล้ว แนะนำให้เริ่มต้นด้วย 25 ครั้ง ซึ่งใช้ต้นทุนน้อยมากสำหรับชุดข้อมูลขนาดนี้ หากไม่ทำเช่นนั้น เส้นโค้งข้อศอกเองก็จะไม่มีเสถียรภาพ เนื่องจากแต่ละจุดบนกราฟมาจากจุดเริ่มต้นที่โชคดีหรือโชคร้ายเพียงครั้งเดียว ดังนั้น ฟังก์ชัน kmean_withinss() ที่กำหนดไว้ก่อนหน้านี้จึงควรเขียนดังนี้:
kmean_withinss <- function(k) { cluster <- kmeans(rescale_df, centers = k, nstart = 25) return (cluster$tot.withinss) }
3. หากอัลกอริทึมแจ้งเตือน ให้เพิ่มค่า iter.max หาก R รายงานว่า “ไม่บรรจบกันภายใน 10 รอบ” ให้ส่งค่า iter.max = 50 เพื่อเพิ่มพื้นที่ให้มากขึ้น
K-Means เทียบกับ Hierarchical Clustering ใน R
K-means ไม่ใช่วิธีการจัดกลุ่มเพียงวิธีเดียวที่มีอยู่ และโดยทั่วไปแล้วการเลือกใช้วิธีใดนั้นขึ้นอยู่กับขนาดของข้อมูลและว่าคุณทราบจำนวนกลุ่มที่ต้องการแล้วหรือไม่
| หลักเกณฑ์ | K- หมายถึง | ตามลำดับชั้น |
|---|---|---|
| จำนวนคลัสเตอร์ | ต้องเลือกไว้ล่วงหน้า | เลือกหลังจากนั้น โดยการตัดเดนโดแกรม |
| ความเสถียรของผลลัพธ์ | แตกต่างกันไปตามการเริ่มต้นแบบสุ่ม | กำหนดขึ้น |
| scalability | สามารถจัดการกับชุดข้อมูลขนาดใหญ่มากได้ | ความยากลำบากเมื่อพิมพ์เกินสองสามพันแถว |
| Cluster รูปร่าง | สมมติว่ากลุ่มต่างๆ มีรูปร่างเป็นทรงกลมและมีขนาดใกล้เคียงกัน | ยืดหยุ่นมากขึ้น |
| เอาท์พุต | ชุดฉลากแบบแบน | แผนภูมิเดนโดแกรมแสดงโครงสร้างแบบซ้อนกัน |
| ฟังก์ชันอาร์ | kmeans(df, k) | hclust(dist(df)) |
# Hierarchical alternative on the same scaled data hc <- hclust(dist(rescale_df), method = "ward.D2") plot(hc) groups <- cutree(hc, k = 7)
ด้วยจำนวนข้อมูล 6,259 รายการ การจัดกลุ่มแบบลำดับชั้นต้องสร้างเมทริกซ์ระยะห่างประมาณ 19.6 ล้านคู่ ซึ่งเป็นเหตุผลว่าทำไม k-means จึงเป็นตัวเลือกที่เหมาะสมสำหรับชุดข้อมูลนี้ นอกจากนี้ โปรดทราบว่า k-means สมมติว่ากลุ่มข้อมูลมีขนาดใกล้เคียงกันและมีรูปร่างเป็นทรงกลมโดยประมาณ ในกรณีที่สมมติฐานนั้นไม่เป็นจริง DBSCAN จะจัดการกับรูปร่างที่ไม่สม่ำเสมอและระบุจุดผิดปกติแทนที่จะบังคับให้ทุกจุดเข้าไปอยู่ในกลุ่มใดกลุ่มหนึ่ง
K- หมายถึง Clusterการใช้งานใน R: เอกสารอ้างอิงฟังก์ชัน
ฟังก์ชันทั้งหมดที่ใช้ในบทช่วยสอนนี้แสดงไว้ด้านล่างนี้:
| แพ็คเกจ | วัตถุประสงค์ | ฟังก์ชัน | ข้อโต้แย้ง |
|---|---|---|---|
| ฐาน | ฝึกเคมีน | กม.() | df เค |
| การเข้าถึงคลัสเตอร์ | kmeans()$คลัสเตอร์ | ||
| Cluster ศูนย์ | kmeans()$centers | ||
| Cluster ขนาด | kmeans()$size | ||
| ผลรวมภายในผลรวมของกำลังสอง | kmeans()$tot.withinss | ใช้โดยวิธีข้อศอก | |
| ระหว่างผลรวมของกำลังสอง | kmeans()$betweenss | ||
| ฐาน | การทดสอบที่สามารถทำซ้ำได้ | ตั้งค่าเมล็ดพันธุ์() | คุณค่าของเมล็ดพันธุ์ |
| ฐาน | ทำให้ผลลัพธ์คงที่ | kmeans(df, k, nstart = 25) | nstart |








