การใช้แพคเกจสถิติใน R สำหรับการจัดกลุ่ม kmeans


10

ฉันมีปัญหาในการทำความเข้าใจกับแพคเกจคลัสเตอร์หนึ่งหรือสองด้าน ฉันกำลังติดตามตัวอย่างจากQuick-Rอย่างใกล้ชิด แต่ไม่เข้าใจการวิเคราะห์หนึ่งหรือสองอย่าง ฉันได้รวมรหัสที่ฉันใช้สำหรับตัวอย่างนี้โดยเฉพาะ

## Libraries
library(stats)
library(fpc) 

## Data
mydata = structure(list(a = c(461.4210925, 1549.524107, 936.42856, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131.4349206, 0, 762.6110846, 
3837.850406), b = c(19578.64174, 2233.308842, 4714.514274, 0, 
2760.510002, 1225.392118, 3706.428246, 2693.353714, 2674.126613, 
592.7384164, 1820.976961, 1318.654162, 1075.854792, 1211.248996, 
1851.363623, 3245.540062, 1711.817955, 2127.285272, 2186.671242
), c = c(1101.899095, 3.166506463, 0, 0, 0, 1130.890295, 0, 654.5054857, 
100.9491289, 0, 0, 0, 0, 0, 789.091922, 0, 0, 0, 0), d = c(33184.53871, 
11777.47447, 15961.71874, 10951.32402, 12840.14983, 13305.26424, 
12193.16597, 14873.26461, 11129.10269, 11642.93146, 9684.238583, 
15946.48195, 11025.08607, 11686.32213, 10608.82649, 8635.844964, 
10837.96219, 10772.53223, 14844.76478), e = c(13252.50358, 2509.5037, 
1418.364947, 2217.952853, 166.92007, 3585.488983, 1776.410835, 
3445.14319, 1675.722506, 1902.396338, 945.5376228, 1205.456943, 
2048.880329, 2883.497101, 1253.020175, 1507.442736, 0, 1686.548559, 
5662.704559), f = c(44.24828759, 0, 485.9617601, 372.108855, 
0, 509.4916263, 0, 0, 0, 212.9541122, 80.62920455, 0, 0, 30.16525587, 
135.0501384, 68.38023073, 0, 21.9317122, 65.09052886), g = c(415.8909649, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 637.2629479, 0, 0, 
0), h = c(583.2213618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0), i = c(68206.47387, 18072.97762, 23516.98828, 
13541.38572, 15767.5799, 19756.52726, 17676.00505, 21666.267, 
15579.90094, 14351.02033, 12531.38237, 18470.59306, 14149.82119, 
15811.23348, 14637.35235, 13588.64291, 12549.78014, 15370.90886, 
26597.08152)), .Names = c("a", "b", "c", "d", "e", "f", "g", 
"h", "i"), row.names = c(NA, -19L), class = "data.frame")

จากนั้นฉันสร้างมาตรฐานของตัวแปร:

# standardize variables
mydata <- scale(mydata) 

## K-means Clustering 

# Determine number of clusters
wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var))
for (i in 2:15) wss[i] <- sum(kmeans(mydata, centers=i)$withinss)
# Q1
plot(1:15, wss, type="b", xlab="Number of Clusters",  ylab="Within groups sum of squares") 

# K-Means Cluster Analysis
fit <- kmeans(mydata, 3) # number of values in cluster solution

# get cluster means 
aggregate(mydata,by=list(fit$cluster),FUN=mean)

# append cluster assignment
mydata <- data.frame(mydata, cluster = fit$cluster)

# Cluster Plot against 1st 2 principal components - vary parameters for most readable graph
clusplot(mydata, fit$cluster, color=TRUE, shade=TRUE, labels=0, lines=0) # Q2

# Centroid Plot against 1st 2 discriminant functions
plotcluster(mydata, fit$cluster)

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

อัปเดต: ตอนนี้ฉันเข้าใจแล้วว่าclusplot()ฟังก์ชั่นนี้เป็นแผนแบบ bivariate โดยมี PCA1 และ PCA2 อย่างไรก็ตามฉันไม่เข้าใจลิงก์ระหว่างส่วนประกอบ PCA และกลุ่มคลัสเตอร์ ความสัมพันธ์ระหว่างค่า PCA และกลุ่มการจัดกลุ่มคืออะไร? ฉันได้อ่านที่อื่นเกี่ยวกับลิงก์ระหว่าง kmeans และ PCA แต่ฉันยังไม่เข้าใจว่าจะสามารถแสดงบนกราฟ bivariate เดียวกันได้อย่างไร


ขออภัยถ้าฉันถามคำถามมากเกินไปเกี่ยวกับการจัดกลุ่มในช่วงสองสามวันที่ผ่านมา ฉันพยายามทำความคุ้นเคยกับฟิลด์นี้เร็วขึ้น (เช่นกันฉันโพสต์คำถามนี้บน SO, stackoverflow.com/questions/4997870//แต่แนะนำให้ย้ายที่นี่)
celenius

ไม่เป็นไรนี่ไม่ใช่ TCS.SE (-;

# กำหนดจำนวนกลุ่มคุณช่วยอธิบายว่าทำไมเราจึงใช้สูตรนี้ (mydata, 2, var) และทำไม 2:15?

คำตอบ:


8

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

WSS มีความสัมพันธ์กับตัวแปรของคุณในแง่ต่อไปนี้สูตรสำหรับ WSS คือ

ΣJΣxผมJ||xผม-μJ||2

μJJxผมผมJ

คำตอบสำหรับคำถาม 2 คือสิ่งนี้ สิ่งที่คุณกำลังดูอยู่ clusplot()คือสิ่งที่คุณสังเกตเห็นในระนาบหลัก สิ่งที่ฟังก์ชั่นนี้ทำคือการคำนวณคะแนนองค์ประกอบหลักสำหรับการสังเกตแต่ละครั้งของคุณการวางแผนคะแนนและการระบายสีตามกลุ่ม

การวิเคราะห์องค์ประกอบหลัก (PCA) เป็นเทคนิคการลดขนาด มัน "สรุป" ข้อมูลของตัวแปรทั้งหมดเป็นสองตัวแปร "ใหม่" ที่เรียกว่าส่วนประกอบ แต่ละองค์ประกอบมีหน้าที่อธิบายเปอร์เซ็นต์ที่แน่นอนของความแปรปรวนทั้งหมด ในตัวอย่างที่คุณอ่าน "องค์ประกอบทั้งสองนี้อธิบาย 73.95% ของความแปรปรวนทั้งหมด"

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

สำหรับการอ้างอิงเพิ่มเติมเกี่ยวกับการวิเคราะห์องค์ประกอบหลักคุณสามารถอ่านวิกิ ถ้าคุณต้องการหนังสือที่ฉันแนะนำ Modern Multivariate Techniques โดย Izenmann คุณจะพบ PCA และ k-mean

หวังว่าจะช่วย :)


1
ขอบคุณสำหรับคำตอบ. ฉันมีคำถามเพิ่มเติมอีกหนึ่งข้อเกี่ยวกับclusplot()ฟังก์ชันนี้ ความสัมพันธ์ระหว่างค่า PCA และกลุ่มการจัดกลุ่มคืออะไร? ฉันได้อ่านที่อื่นเกี่ยวกับลิงก์ระหว่าง kmeans และ PCA แต่ฉันยังไม่เข้าใจว่าจะสามารถแสดงบนกราฟ bivariate เดียวกันได้อย่างไร (อาจเป็นคำถามใหม่ในตัวเอง)
celenius

2
ที่จริงแล้วค่า PCA และกลุ่มการทำคลัสเตอร์นั้นเป็นอิสระต่อกัน PCA สร้างพิกัด "ใหม่" สำหรับการสังเกตแต่ละครั้งmydataนั่นคือสิ่งที่คุณเห็นในพล็อต รูปร่างของจุดที่มีการวางแผนโดยใช้พารามิเตอร์ที่สองของfit$cluster clusplot()บางทีคุณควรมองลึกเข้าไปใน PCA แจ้งให้เราทราบหากสิ่งนี้ช่วยคุณหรือถ้าคุณอ้างอิงเพิ่มเติม
deps_stats

1
มันช่วยได้ (ในแง่ที่ว่าฉันสร้างเสริมในปัญหาของฉัน!) วิธีการfit$clusterที่เกี่ยวข้องกับ "พิกัด" PCA? ฉันคิดว่าฉันเข้าใจวิธีการทำงานของ PCA แต่เมื่อฉันเข้าใจแล้วแต่ละคอมโพเนนต์ไม่สามารถอธิบายได้โดยใช้ตัวแปรจากข้อมูลดั้งเดิม (แทนที่จะเป็นการรวมเชิงเส้นของข้อมูลดิบ) ซึ่งเป็นสาเหตุที่ฉันไม่เข้าใจว่ามันจะเป็นไปได้อย่างไร เกี่ยวข้องกับกลุ่ม
celenius

2
คุณเกือบเข้าใจแล้ว :) fit$clusterไม่เกี่ยวข้องกับ PCA สิ่งที่clusplot()จะเป็นพล็อตจุดโดยใช้พิกัด "ใหม่" fit$clusterและฉลากพวกเขาใช้ ฉันได้รับ '+' สำหรับคลัสเตอร์ 3, 'o' สำหรับคลัสเตอร์ 1 และสามเหลี่ยมสำหรับคลัสเตอร์ 2 ฟังก์ชันclusplot()นี้มีประโยชน์ในการแสดงภาพการจัดกลุ่ม
deps_stats

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