Sử dụng gói số liệu thống kê trong R để phân cụm kmeans


10

Tôi đang gặp khó khăn để hiểu một hoặc hai khía cạnh của gói cụm. Tôi đang theo dõi ví dụ từ Quick-R một cách chặt chẽ, nhưng không hiểu một hoặc hai khía cạnh của phân tích. Tôi đã bao gồm mã mà tôi đang sử dụng cho ví dụ cụ thể này.

## 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")

Sau đó, tôi chuẩn hóa các biến:

# 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)

Câu hỏi của tôi là, làm thế nào cốt truyện hiển thị số cụm (được đánh dấu Q1trong mã của tôi) có thể liên quan đến các giá trị thực tế (số cụm và tên biến)?

Cập nhật: Bây giờ tôi hiểu rằng clusplot()chức năng này là một âm mưu hai biến, với PCA1 và PCA2. Tuy nhiên, tôi không hiểu liên kết giữa các thành phần PCA và các nhóm cụm. Mối quan hệ giữa các giá trị PCA và các nhóm phân cụm là gì? Tôi đã đọc ở nơi khác về liên kết giữa kmeans và PCA, nhưng tôi vẫn không hiểu làm thế nào chúng có thể được hiển thị trên cùng một biểu đồ hai biến.


xin lỗi nếu tôi đã hỏi quá nhiều câu hỏi về việc phân cụm trong vài ngày qua. Tôi đang cố gắng làm quen nhanh hơn với lĩnh vực này (tôi cũng đã đăng câu hỏi này trên SO, stackoverflow.com/questions/4997870/ , nhưng nó được đề xuất để chuyển nó đến đây)
celenius

Không sao, đây không phải là TCS.SE (-;

# Xác định số lượng cụm Bạn có thể giải thích lý do tại sao chúng tôi sử dụng công thức này (mydata, 2, var) và tại sao 2:15?

Câu trả lời:


8

Tôi đã không hoàn toàn nắm bắt câu hỏi 1, nhưng tôi sẽ cố gắng trả lời. Biểu đồ của Q1 cho thấy tổng số bình phương (wss) thay đổi như thế nào khi số cụm thay đổi. Trong loại ô này, bạn phải tìm kiếm các nút thắt trong biểu đồ, một nút ở 5 chỉ ra rằng nên sử dụng 5 cụm.

WSS có mối quan hệ với các biến của bạn theo nghĩa sau, công thức cho WSS là

jxiCj||xiμj||2

Trong đó là điểm trung bình của cụm và là quan sát thứ . Chúng tôi biểu thị cụm j là . WSS đôi khi được hiểu là "các điểm bên trong của mỗi cụm" giống nhau như thế nào. Sự giống nhau này đề cập đến các biến. j x i i C jμjjxiiCj

Câu trả lời cho câu hỏi 2 là đây. Những gì bạn đang thực sự xem trong clusplot()là âm mưu quan sát của bạn trong mặt phẳng chính. Những gì chức năng này đang làm là tính toán điểm thành phần chính cho từng quan sát của bạn, vẽ các điểm số đó và tô màu theo cụm.

Phân tích thành phần chính (PCA) là một kỹ thuật giảm kích thước; nó "tóm tắt" thông tin của tất cả các biến thành một vài biến "mới" được gọi là các thành phần. Mỗi thành phần có trách nhiệm giải thích tỷ lệ phần trăm nhất định của tổng biến thiên. Trong ví dụ bạn đọc "Hai thành phần này giải thích 73,95% tổng biến thiên".

Các chức năng clusplot()được sử dụng để xác định hiệu quả của phân cụm. Trong trường hợp bạn có một cụm thành công, bạn sẽ thấy các cụm được phân tách rõ ràng trong mặt phẳng chính. Mặt khác, bạn sẽ thấy các cụm được hợp nhất trong mặt phẳng chính khi phân cụm không thành công.

Để tham khảo thêm về phân tích thành phần chính, bạn có thể đọc wiki. nếu bạn muốn có một cuốn sách tôi đề xuất các kỹ thuật đa biến hiện đại của Izenmann, ở đó bạn sẽ tìm thấy PCA và k-mean.

Hi vọng điêu nay co ich :)


1
Cảm ơn về câu trả lời của bạn. Tôi đã có thêm một câu hỏi về clusplot()chức năng. Mối quan hệ giữa các giá trị PCA và các nhóm phân cụm là gì? Tôi đã đọc ở nơi khác về liên kết giữa kmeans và PCA, nhưng tôi vẫn không hiểu làm thế nào chúng có thể được hiển thị trên cùng một biểu đồ hai biến. (Có lẽ đây là một câu hỏi mới).
celenius

2
Trên thực tế, các giá trị PCA và các nhóm phân cụm là độc lập. PCA tạo tọa độ "mới" cho mỗi lần quan sát mydata, đó là những gì bạn thực sự nhìn thấy trên cốt truyện. Hình dạng của các điểm được vẽ bằng cách sử dụng fit$cluster, tham số thứ hai của clusplot(). Có lẽ bạn nên nhìn sâu hơn vào PCA. Hãy cho tôi biết nếu điều này giúp bạn, hoặc nếu bạn tham khảo thêm.
deps_stats

1
Nó giúp (theo nghĩa là tôi đang khắc phục vấn đề của mình!). Làm thế nào có fit$clusterliên quan đến "tọa độ" PCA? Tôi nghĩ rằng tôi hiểu PCA hoạt động như thế nào, nhưng theo tôi hiểu, mỗi Thành phần không thể được giải thích bằng các biến từ dữ liệu gốc (thay vào đó là sự kết hợp tuyến tính của dữ liệu thô), đó là lý do tại sao tôi không hiểu làm thế nào nó có thể liên quan đến các cụm.
celenius

2
Bạn gần như đã hiểu nó :) fit$clusterkhông liên quan đến PCA. Điều clusplot()cần làm là vẽ các điểm bằng tọa độ "mới" và gắn nhãn cho chúng bằng cách sử dụng fit$cluster. Tôi đã nhận '+' cho cụm 3, 'o' cho cụm 1 và tam giác cho cụm 2. Hàm clusplot()này rất hữu ích để trực quan hóa cụm.
deps_stats

1
Theo tọa độ "mới", ý tôi là PCA1 và PCA2. Bạn nói đúng, chúng hoàn toàn không liên quan đến fit$cluster:)
deps_stats
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.