K หมายถึง Clusterการเขียนโปรแกรมด้วยภาษา R พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

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

  • 🧭 วิธีการแบบไม่กำกับดูแล: Clusterการค้นหาโครงสร้างและสร้างป้ายกำกับนั้น แทนที่จะทำนายผลลัพธ์ที่ทราบอยู่แล้ว
  • 📐 กำหนดมาตรฐานก่อน: ฟังก์ชัน scale() จะกำหนดค่าเฉลี่ยของตัวแปรทุกตัวเป็นศูนย์และค่าเบี่ยงเบนมาตรฐานเป็นหนึ่ง ดังนั้นจึงไม่มีคอลัมน์ใดที่มีอิทธิพลต่อระยะทางมากเกินไป
  • 🔄 ลูปแบบวนซ้ำ: กำหนดจุดต่างๆ ให้กับจุดศูนย์กลางที่ใกล้ที่สุด คำนวณจุดศูนย์กลางใหม่ และทำซ้ำจนกว่าจะไม่มีการเปลี่ยนแปลงคลัสเตอร์ของข้อมูลสังเกตใดๆ อีก
  • 📉 การเลือก k: พล็อตค่า tot.withinss ในช่วงค่า k ต่างๆ แล้วหาจุดหักงอ ซึ่งเป็นจุดที่คลัสเตอร์เพิ่มเติมไม่ก่อให้เกิดผลตอบแทนอีกต่อไป
  • 🎲 ความสามารถในการทำซ้ำ: ผลลัพธ์อาจแตกต่างกันไปในแต่ละรอบ ดังนั้น set.seed() จะกำหนดค่าเริ่มต้นให้คงที่ และ nstart = 25 จะเก็บค่าที่ดีที่สุดจากค่าเริ่มต้นหลายๆ ค่า
  • 🌡️ การตีความ: แผนที่แสดงความหนาแน่นของจุดศูนย์กลางที่ปรับขนาดแล้ว แสดงให้เห็นได้อย่างรวดเร็วว่าตัวแปรใดเป็นตัวกำหนดแต่ละกลุ่ม

K หมายถึง Clustering ใน R

ความหมายของ 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()

Cluster การวิเคราะห์

จุดนี้มองเห็นลวดลายได้

  1. ด้านซ้ายล่างจะมองเห็นกลุ่มวัยรุ่นที่มีกำลังซื้อต่ำกว่า
  2. ระดับกลางตอนบนสะท้อนถึงคนที่มีงานที่สามารถใช้จ่ายได้มากขึ้น
  3. สุดท้ายคือผู้สูงอายุที่มีงบประมาณต่ำกว่า

Cluster การวิเคราะห์

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

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้วิธีการใช้งาน k- หมายถึง ขั้นตอนวิธี

อัลกอริทึม K-Means

K-means เป็นวิธีการจัดกลุ่มที่ใช้กันอย่างแพร่หลายที่สุด อัลกอริทึมนี้มีมาตั้งแต่ทศวรรษ 1950 และได้รับการปรับปรุงแก้ไขมาหลายครั้งนับตั้งแต่นั้นมา

อัลกอริทึมพยายามค้นหากลุ่มโดยการลดระยะห่างระหว่างการสังเกตที่เรียกว่า ท้องถิ่นที่เหมาะสมที่สุด วิธีแก้ปัญหา ระยะทางจะวัดจากพิกัดของการสังเกต ตัวอย่างเช่น ในพื้นที่สองมิติ พิกัดก็คือ x และ y เท่านั้น

อัลกอริทึม K-mean

อัลกอริทึมทำงานดังนี้:

  • ขั้นตอนที่ 1: เลือกจุดศูนย์กลางเริ่มต้น k จุดแบบสุ่มในพื้นที่คุณลักษณะ
  • ขั้นตอนที่ 2: กำหนดให้ข้อมูลสังเกตการณ์แต่ละรายการอยู่ในกลุ่มศูนย์กลางที่ใกล้ที่สุด เซนทรอยด์. ซึ่งจะทำให้เกิดกลุ่ม k กลุ่ม
  • ขั้นตอนที่ 3: Shift เซนทรอยด์เริ่มต้นถึงค่าเฉลี่ยของพิกัดภายในกลุ่ม
  • ขั้นตอนที่ 4: ลดระยะห่างให้เหลือน้อยที่สุดตามเซนทรอยด์ใหม่ มีการสร้างขอบเขตใหม่ ดังนั้นการสังเกตจะย้ายจากกลุ่มหนึ่งไปอีกกลุ่มหนึ่ง
  • ทำซ้ำจนกว่าจะไม่มีการเปลี่ยนแปลงกลุ่มการสังเกต

โดยปกติแล้ว K-means จะวัดระยะทางแบบยุคลิดระหว่างค่าสังเกตสองค่า x และ y:

อัลกอริทึม K-mean

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

การเลือกจำนวนคลัสเตอร์

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

จำนวนคลัสเตอร์ขึ้นอยู่กับลักษณะของชุดข้อมูล อุตสาหกรรม ธุรกิจ และอื่นๆ อย่างไรก็ตาม มีกฎเกณฑ์ง่ายๆ ในการเลือกจำนวนคลัสเตอร์ที่เหมาะสม:

เลือกจำนวน Clusters

โดยที่ 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()

การตรวจสอบ Cluster

วิธีการสร้างผลลัพธ์ 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

คำถามที่พบบ่อย

จุดศูนย์กลางเริ่มต้นจะถูกเลือกแบบสุ่ม ดังนั้นอัลกอริทึมจึงสามารถหาค่าเหมาะสมที่สุดเฉพาะที่ได้หลายค่า ใช้ set.seed() เพื่อให้การทำงานสามารถทำซ้ำได้ และ nstart = 25 เพื่อเก็บค่าที่ดีที่สุดจากจุดเริ่มต้นแบบสุ่มหลายๆ ครั้ง

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

กลับไปใช้เมธอด silhouette ซึ่งจะให้คะแนนว่าแต่ละจุดเข้ากับกลุ่มได้ดีแค่ไหน หรือใช้สถิติ gap ก็ได้ ทั้งสองวิธีนี้มีให้ใช้งานผ่านฟังก์ชัน fviz_nbclust() ในแพ็กเกจ factoextra

K-means เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการแบ่งกลุ่มลูกค้า การปรับปริมาณสีของภาพ การตรวจจับความผิดปกติ และการจัดกลุ่มเอกสารpingนอกจากนี้ยังใช้ในการบีบอัดคุณลักษณะก่อนที่จะฝึกโมเดลแบบมีผู้กำกับดูแลด้วยคุณลักษณะเหล่านั้น

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

สรุปโพสต์นี้ด้วย: