Nếu câu hỏi của bạn là how can I determine how many clusters are appropriate for a kmeans analysis of my data?
, thì đây là một số tùy chọn. Các bài viết wikipedia về việc xác định số lượng các cụm có một đánh giá tốt của một số các phương pháp này.
Đầu tiên, một số dữ liệu có thể tái tạo (dữ liệu trong Q là ... không rõ ràng đối với tôi):
n = 100
g = 6
set.seed(g)
d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))),
y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))))
plot(d)
Một . Tìm kiếm một uốn cong hoặc khuỷu tay trong tổng số âm mưu scree lỗi bình phương (SSE). Xem http://www.statmethods.net/advstats/cluster.html & http://www.mattpeeples.net/kmeans.html để biết thêm. Vị trí của khuỷu tay trong ô kết quả cho thấy một số cụm phù hợp cho kmeans:
mydata <- d
wss <- (nrow(mydata)-1)*sum(apply(mydata,2,var))
for (i in 2:15) wss[i] <- sum(kmeans(mydata,
centers=i)$withinss)
plot(1:15, wss, type="b", xlab="Number of Clusters",
ylab="Within groups sum of squares")
Chúng tôi có thể kết luận rằng 4 cụm sẽ được chỉ định bằng phương pháp này:
Hai . Bạn có thể thực hiện phân vùng xung quanh medoid để ước tính số lượng cụm sử dụng pamk
chức năng trong gói fpc.
library(fpc)
pamk.best <- pamk(d)
cat("number of clusters estimated by optimum average silhouette width:", pamk.best$nc, "\n")
plot(pam(d, pamk.best$nc))
# we could also do:
library(fpc)
asw <- numeric(20)
for (k in 2:20)
asw[[k]] <- pam(d, k) $ silinfo $ avg.width
k.best <- which.max(asw)
cat("silhouette-optimal number of clusters:", k.best, "\n")
# still 4
Ba . Tiêu chí Calinsky: Một cách tiếp cận khác để chẩn đoán có bao nhiêu cụm phù hợp với dữ liệu. Trong trường hợp này, chúng tôi cố gắng 1 đến 10 nhóm.
require(vegan)
fit <- cascadeKM(scale(d, center = TRUE, scale = TRUE), 1, 10, iter = 1000)
plot(fit, sortg = TRUE, grpmts.plot = TRUE)
calinski.best <- as.numeric(which.max(fit$results[2,]))
cat("Calinski criterion optimal number of clusters:", calinski.best, "\n")
# 5 clusters!
Bốn . Xác định mô hình tối ưu và số lượng cụm theo Tiêu chí Thông tin Bayes cho tối đa hóa kỳ vọng, được khởi tạo bằng cách phân cụm theo phân cấp cho các mô hình hỗn hợp Gaussian được tham số hóa
# See http://www.jstatsoft.org/v18/i06/paper
# http://www.stat.washington.edu/research/reports/2006/tr504.pdf
#
library(mclust)
# Run the function to see how many clusters
# it finds to be optimal, set it to search for
# at least 1 model and up 20.
d_clust <- Mclust(as.matrix(d), G=1:20)
m.best <- dim(d_clust$z)[2]
cat("model-based optimal number of clusters:", m.best, "\n")
# 4 clusters
plot(d_clust)
Năm . Phân cụm ảnh hưởng (AP), xem http://dx.doi.org/10.1126/science.1136800
library(apcluster)
d.apclus <- apcluster(negDistMat(r=2), d)
cat("affinity propogation optimal number of clusters:", length(d.apclus@clusters), "\n")
# 4
heatmap(d.apclus)
plot(d.apclus, d)
Sáu . Thống kê khoảng cách để ước tính số lượng cụm. Xem thêm một số mã cho một đầu ra đồ họa đẹp . Đang thử 2-10 cụm tại đây:
library(cluster)
clusGap(d, kmeans, 10, B = 100, verbose = interactive())
Clustering k = 1,2,..., K.max (= 10): .. done
Bootstrapping, b = 1,2,..., B (= 100) [one "." per sample]:
.................................................. 50
.................................................. 100
Clustering Gap statistic ["clusGap"].
B=100 simulated reference sets, k = 1..10
--> Number of clusters (method 'firstSEmax', SE.factor=1): 4
logW E.logW gap SE.sim
[1,] 5.991701 5.970454 -0.0212471 0.04388506
[2,] 5.152666 5.367256 0.2145907 0.04057451
[3,] 4.557779 5.069601 0.5118225 0.03215540
[4,] 3.928959 4.880453 0.9514943 0.04630399
[5,] 3.789319 4.766903 0.9775842 0.04826191
[6,] 3.747539 4.670100 0.9225607 0.03898850
[7,] 3.582373 4.590136 1.0077628 0.04892236
[8,] 3.528791 4.509247 0.9804556 0.04701930
[9,] 3.442481 4.433200 0.9907197 0.04935647
[10,] 3.445291 4.369232 0.9239414 0.05055486
Đây là kết quả từ việc thực hiện thống kê khoảng cách của Edwin Chen:
Bảy . Bạn cũng có thể thấy hữu ích khi khám phá dữ liệu của mình với clustergram để trực quan hóa việc gán cụm, xem http://www.r-statistic.com/2010/06/clustergram-visualization-and-diagnostics-for-cluster-analysis-r- mã / để biết thêm chi tiết.
Tám . Các gói NbClust cung cấp 30 chỉ số để xác định số lượng các cụm trong một tập dữ liệu.
library(NbClust)
nb <- NbClust(d, diss=NULL, distance = "euclidean",
method = "kmeans", min.nc=2, max.nc=15,
index = "alllong", alphaBeale = 0.1)
hist(nb$Best.nc[1,], breaks = max(na.omit(nb$Best.nc[1,])))
# Looks like 3 is the most frequently determined number of clusters
# and curiously, four clusters is not in the output at all!
Nếu câu hỏi của bạn là how can I produce a dendrogram to visualize the results of my cluster analysis
, thì bạn nên bắt đầu với những điều sau:
http://www.statmethods.net/advstats/cluster.html
http://www.r-tutor.com/gpu-computing/clustering/hierarchical-cluster-analysis
http://gastonsanchez.wordpress.com/2012/10/03/7-ways-to-plot-dendrograms-in-r/ Và xem tại đây để biết thêm các phương pháp kỳ lạ: http://cran.r-project.org/ web / lượt xem / Cluster.html
Đây là vài ví dụ:
d_dist <- dist(as.matrix(d)) # find distance matrix
plot(hclust(d_dist)) # apply hirarchical clustering and plot
# a Bayesian clustering method, good for high-dimension data, more details:
# http://vahid.probstat.ca/paper/2012-bclust.pdf
install.packages("bclust")
library(bclust)
x <- as.matrix(d)
d.bclus <- bclust(x, transformed.par = c(0, -50, log(16), 0, 0, 0))
viplot(imp(d.bclus)$var); plot(d.bclus); ditplot(d.bclus)
dptplot(d.bclus, scale = 20, horizbar.plot = TRUE,varimp = imp(d.bclus)$var, horizbar.distance = 0, dendrogram.lwd = 2)
# I just include the dendrogram here
Ngoài ra, đối với dữ liệu kích thước cao là pvclust
thư viện tính toán các giá trị p để phân cụm theo phân cấp thông qua việc lấy mẫu bootstrap nhiều tầng. Đây là ví dụ từ tài liệu (sẽ không hoạt động trên dữ liệu chiều thấp như trong ví dụ của tôi):
library(pvclust)
library(MASS)
data(Boston)
boston.pv <- pvclust(Boston)
plot(boston.pv)
Có ai giúp tôi không?
fpc
gói. Đó là sự thật, sau đó bạn phải đặt hai tham số ... nhưng tôi đã thấy rằngfpc::dbscan
sau đó thực hiện công việc khá tốt khi tự động xác định một số cụm tốt. Ngoài ra, nó thực sự có thể xuất ra một cụm duy nhất nếu đó là những gì dữ liệu cho bạn biết - một số phương pháp trong câu trả lời xuất sắc của @ Ben sẽ không giúp bạn xác định liệu k = 1 có thực sự tốt nhất hay không.