आर में क्लस्टर विश्लेषण: समूहों की इष्टतम संख्या निर्धारित करते हैं


428

आर में एक नौसिखिया होने के नाते, मुझे बहुत यकीन नहीं है कि k- साधन विश्लेषण करने के लिए क्लस्टर की सबसे अच्छी संख्या कैसे चुननी है। नीचे दिए गए डेटा के सबसेट की साजिश रचने के बाद, कितने क्लस्टर उपयुक्त होंगे? मैं क्लस्टर डेंड्रो विश्लेषण कैसे कर सकता हूं?

n = 1000
kk = 10    
x1 = runif(kk)
y1 = runif(kk)
z1 = runif(kk)    
x4 = sample(x1,length(x1))
y4 = sample(y1,length(y1)) 
randObs <- function()
{
  ix = sample( 1:length(x4), 1 )
  iy = sample( 1:length(y4), 1 )
  rx = rnorm( 1, x4[ix], runif(1)/8 )
  ry = rnorm( 1, y4[ix], runif(1)/8 )
  return( c(rx,ry) )
}  
x = c()
y = c()
for ( k in 1:n )
{
  rPair  =  randObs()
  x  =  c( x, rPair[1] )
  y  =  c( y, rPair[2] )
}
z <- rnorm(n)
d <- data.frame( x, y, z )

4
यदि आप पूरी तरह से kmeans के लिए तैयार नहीं हैं, तो आप fpcपैकेज में उपलब्ध DBSCAN क्लस्टरिंग एल्गोरिदम की कोशिश कर सकते हैं । यह सच है, आपको फिर दो पैरामीटर सेट करने होंगे ... लेकिन मैंने पाया है कि fpc::dbscanतब एक अच्छी संख्या में क्लस्टर की अच्छी संख्या का निर्धारण स्वचालित रूप से होता है। इसके अलावा, यह वास्तव में एकल क्लस्टर का उत्पादन कर सकता है यदि डेटा आपको बताता है - @ बेन के उत्कृष्ट जवाबों में से कुछ तरीके आपको यह निर्धारित करने में मदद नहीं करेंगे कि क्या k = 1 वास्तव में सबसे अच्छा है।
स्टीफन कोलासा

जवाबों:


1020

यदि आपका सवाल है how can I determine how many clusters are appropriate for a kmeans analysis of my data?, तो यहाँ कुछ विकल्प हैं। विकिपीडिया लेख समूहों की संख्या निर्धारित करने पर इन तरीकों में से कुछ की एक अच्छी समीक्षा है।

सबसे पहले, कुछ प्रतिलिपि प्रस्तुत करने योग्य डेटा (क्यू में डेटा ... मेरे लिए अस्पष्ट हैं):

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)

यहां छवि विवरण दर्ज करें

एक । स्क्वेर्ड एरर (एसएसई) स्क्री प्लॉट के योग में मोड़ या कोहनी देखें। अधिक जानकारी के लिए http://www.statmethods.net/advstats/cluster.html & http://www.mattpeeples.net/kmeans.html देखें । परिणामी भूखंड में कोहनी का स्थान किमी के लिए उपयुक्त क्लस्टर का सुझाव देता है:

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

हम यह निष्कर्ष निकाल सकते हैं कि 4 क्लस्टर इस विधि द्वारा इंगित किए जाएंगे: यहां छवि विवरण दर्ज करें

दो । आप pamkfpc पैकेज में फ़ंक्शन का उपयोग करके क्लस्टर की संख्या का अनुमान लगाने के लिए मेडोइड्स के आसपास विभाजन कर सकते हैं ।

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

तीन । Calinsky मानदंड: निदान करने के लिए एक और दृष्टिकोण कि कितने क्लस्टर डेटा के अनुरूप हैं। इस मामले में हम 1 से 10 समूहों की कोशिश करते हैं।

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!

यहां छवि विवरण दर्ज करें

चार । अपेक्षा और अधिकतमकरण के लिए बायेसियन सूचना मानदंड के अनुसार इष्टतम मॉडल और समूहों की संख्या निर्धारित करें, जो मानकीकृत गाऊसी मिश्रण मॉडल के लिए श्रेणीबद्ध क्लस्टरिंग द्वारा आरंभ किया गया है।

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

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

पाँच । आत्मीयता प्रसार (एपी) क्लस्टरिंग, 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)

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

छह । समूहों की संख्या का अनुमान लगाने के लिए गैप स्टेटिस्टिक। एक अच्छा चित्रमय आउटपुट के लिए कुछ कोड भी देखें । यहाँ 2-10 क्लस्टर आज़मा रहे हैं:

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

यहाँ एडविन चेन के गैप स्टैटिस्टिक के कार्यान्वयन से आउटपुट है: यहां छवि विवरण दर्ज करें

सात । आप क्लस्टर असाइनमेंट की कल्पना करने के लिए क्लस्टरग्राम के साथ अपने डेटा का पता लगाने के लिए भी उपयोगी हो सकते हैं, http://www.r-statistics.com/2010/06/clustergram-visualization-and-diagnostics-for-cluster-analysis.r पर देखें अधिक जानकारी के लिए कोड /

आठNbClust पैकेज किसी डेटासेट में समूहों की संख्या निर्धारित करने के लिए 30 सूचकांक प्रदान करता है।

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!

यहां छवि विवरण दर्ज करें

यदि आपका प्रश्न है how can I produce a dendrogram to visualize the results of my cluster analysis, तो आपको इनसे शुरू करना चाहिए: http://www.statmethods.net/advstats/cluster.html http://www.r-tutor.com/gpu-computing/clustering/hierarchical-cluster-ansterysis http://gastonsanchez.wordpress.com/2012/10/03/7-ways-to-plot-dendrograms-in-r/ और यहाँ और अधिक विदेशी तरीकों के लिए देखें: http://cran.r-project.org/ वेब / विचारों / Cluster.html

कुछ उदाहरण निम्नलिखित हैं:

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

यहां छवि विवरण दर्ज करें

हाई-डायमेंशन डेटा के लिए भी pvclustलाइब्रेरी है जो मल्टीस्केल बूटस्ट्रैप रिस्पॉन्सिंग के माध्यम से पदानुक्रमिक क्लस्टरिंग के लिए पी-वैल्यू की गणना करता है। यहाँ प्रलेखन से उदाहरण है (मेरे उदाहरण में इस तरह के कम आयामी डेटा पर काम नहीं):

library(pvclust)
library(MASS)
data(Boston)
boston.pv <- pvclust(Boston)
plot(boston.pv)

यहां छवि विवरण दर्ज करें

क्या उसकी कोई मदद करता है?


अंतिम डेंडोग्राम (एयू / बीपी के साथ क्लस्टर डेंडोग्राम) के लिए कभी-कभी समूहों के आसपास आयतों को अपेक्षाकृत उच्च पी-मानों के साथ खींचना सुविधाजनक होता है: pvrect (फिट, अल्फा = 0.95)
इगोर एल्बर्ट

यही वह है जिसकी तलाश में मैं हूं। मैं आर के लिए नया हूं और मुझे इसे खोजने में बहुत समय लगेगा। ऐसे विस्तार से जवाब देने के लिए @ धन्यवाद। क्या आप कृपया मुझे मार्गदर्शन कर सकते हैं कि मैं इनमें से हर एक विधि के पीछे तर्क कहाँ पा सकता हूँ, जैसे कि वे कौन-सी मीट्रिक या मानदंड हैं, जिनका उपयोग वे क्लस्टर्स की इष्टतम संख्या निर्धारित करने के लिए कर रहे हैं या उनमें से प्रत्येक एक दूसरे से कैसे भिन्न है। मेरे बॉस चाहते हैं कि मैं यह बताऊं, इसलिए हम तय कर सकते हैं कि किस विधि का उपयोग करना है। अग्रिम में धन्यवाद।
नसिया जाफरी

1
@ एलेक्ज़ेंडर ब्लेक आप किसी भी ग्राफिकल पद्धति को विश्लेषणात्मक करने की कोशिश कर सकते हैं। उदाहरण के लिए, मैं "कोहनी" विधि का उपयोग करता हूं (पहले उत्तर में वर्णित है), लेकिन इसे विश्लेषणात्मक रूप से खोजने का प्रयास करें। कोहनी बिंदु अधिकतम वक्रता वाला बिंदु हो सकता है। असतत डेटा के लिए, यह अधिकतम दूसरे क्रम केंद्रीय अंतर के साथ बिंदु है (निरंतर डेटा के लिए अधिकतम से दूसरे क्रम व्युत्पन्न)। Stackoverflow.com/a/4473065/1075993 और stackoverflow.com/q/2018178/1075993 देखें । मुझे लगता है कि अन्य चित्रमय विधियों को भी विश्लेषणात्मक में बदला जा सकता है।
एंड्री सपेगिन

1
@AndreySapegin: मैं कर सकता था, लेकिन: 1) स्पष्ट रूप से, मैं इसे एक सुरुचिपूर्ण समाधान नहीं मानता (IMHO, ज्यादातर मामलों में, दृश्य तरीकों को दृश्य रहना चाहिए, जबकि विश्लेषणात्मक लोगों को विश्लेषणात्मक रहना चाहिए); 2) मैंने एक या कई Rपैकेजों का उपयोग करके इसके लिए विश्लेषणात्मक समाधान निकाला है (यह मेरे GitHub पर है - आपका स्वागत है कि आप एक नज़र डालें); 3) मेरा समाधान काफी अच्छी तरह से काम करने लगता है, इसके अलावा, यह कुछ समय रहा है और मैंने पहले ही अपने शोध प्रबंध सॉफ्टवेयर, शोध प्रबंध रिपोर्ट (थीसिस) को अंतिम रूप दे दिया है और वर्तमान में मैं रक्षा :-) के लिए तैयारी कर रहा हूं। भले ही, मैं आपकी टिप्पणी और लिंक की बहुत सराहना करता हूं। शुभकामनाएं!
असेम्बली बेलेख

1
2.2 मिलियन पंक्तियाँ मेरे वर्तमान क्लस्टरिंग डेटासेट में हैं। इनमें से कोई भी आर पैकेज इस पर काम नहीं करता है, मुझे उम्मीद है। वे सिर्फ मेरे कंप्यूटर को पॉप करते हैं और फिर यह मेरे अनुभव से गिर जाता है। हालांकि, ऐसा लगता है कि लेखक सॉफ्टवेयर की क्षमता की परवाह किए बिना छोटे डेटा के लिए और सामान्य मामले के लिए अपना सामान जानता है। लेखक द्वारा स्पष्ट अच्छे काम के कारण कोई अंक नहीं काटा गया। यदि आप केवल पुराने पुराने आर को जानते हैं, तो कृपया 2.2 मिलियन पंक्तियों में भयानक हैं - यदि आप मुझ पर भरोसा नहीं करते हैं तो इसे स्वयं आज़माएं। एच 2 ओ मदद करता है लेकिन खुश की एक छोटी दीवार वाले बगीचे तक सीमित है।
जेफ्री एंडरसन

21

इस तरह के एक विस्तृत जवाब में कुछ जोड़ना मुश्किल है। हालांकि मुझे लगता है कि हमें identifyयहां उल्लेख करना चाहिए , खासकर क्योंकि @ बेंड बहुत सारे डेंड्रोग्राम उदाहरण दिखाता है।

d_dist <- dist(as.matrix(d))   # find distance matrix 
plot(hclust(d_dist)) 
clusters <- identify(hclust(d_dist))

identifyआपको एक डेंड्रोग्राम से अंतःक्रियात्मक रूप से क्लस्टर चुनने और अपनी पसंद को एक सूची में संग्रहीत करने देता है। इंटरैक्टिव मोड को छोड़ने और आर कंसोल पर लौटने के लिए Esc को मारो। ध्यान दें, कि सूची में सूचकांकों को शामिल किया गया है, न कि पंक्तिबद्ध नामों (जैसा कि विरोध किया गया है cutree)।


10

क्लस्टरिंग विधियों में इष्टतम k- क्लस्टर निर्धारित करने के लिए। मैं आमतौर पर Elbowसमय-कोसम्यूइंग से बचने के लिए समानांतर प्रसंस्करण के साथ विधि का उपयोग करता हूं । यह कोड इस तरह से नमूना ले सकता है:

कोहनी की विधि

elbow.k <- function(mydata){
dist.obj <- dist(mydata)
hclust.obj <- hclust(dist.obj)
css.obj <- css.hclust(dist.obj,hclust.obj)
elbow.obj <- elbow.batch(css.obj)
k <- elbow.obj$k
return(k)
}

चल रहा कोहनी समानांतर

no_cores <- detectCores()
    cl<-makeCluster(no_cores)
    clusterEvalQ(cl, library(GMD))
    clusterExport(cl, list("data.clustering", "data.convert", "elbow.k", "clustering.kmeans"))
 start.time <- Sys.time()
 elbow.k.handle(data.clustering))
 k.clusters <- parSapply(cl, 1, function(x) elbow.k(data.clustering))
    end.time <- Sys.time()
    cat('Time to find k using Elbow method is',(end.time - start.time),'seconds with k value:', k.clusters)

यह अच्छा काम करता है।


2
कोहनी और सीएसएस फ़ंक्शन GMD पैकेज से आ रहे हैं: cran.r-project.org/web/packages/GMD/GMD.pdf
रोहन

6

बेन से शानदार जवाब। हालाँकि मुझे आश्चर्य है कि एफ-एफ़िनिटी प्रोपेगैशन (एपी) विधि यहाँ k-mean विधि के लिए क्लस्टर की संख्या ज्ञात करने के लिए सुझाई गई है, जहाँ सामान्य रूप से AP डेटा को बेहतर बनाने के लिए बेहतर कार्य करता है। कृपया विज्ञान में इस पद्धति का समर्थन करने वाले वैज्ञानिक पेपर यहां देखें:

फ्रे, ब्रेंडन जे, और डेल्बर्ट ड्यूक। "डेटा बिंदुओं के बीच संदेश पास करके क्लस्टरिंग।" विज्ञान 315.5814 (2007): 972-976।

इसलिए यदि आप k-mean की ओर से पक्षपाती नहीं हैं, तो मैं सीधे AP का उपयोग करने का सुझाव देता हूं, जो क्लस्टर की संख्या को जानने की आवश्यकता के बिना डेटा को क्लस्टर करेगा:

library(apcluster)
apclus = apcluster(negDistMat(r=2), data)
show(apclus)

यदि नकारात्मक यूक्लिडियन दूरी उचित नहीं है, तो आप एक ही पैकेज में प्रदान किए गए अन्य समानता उपायों का उपयोग कर सकते हैं। उदाहरण के लिए, स्पीयरमैन सहसंबंधों पर आधारित समानताओं के लिए, आपको यही चाहिए:

sim = corSimMat(data, method="spearman")
apclus = apcluster(s=sim)

कृपया ध्यान दें कि एपी पैकेज में समानता के लिए उन कार्यों को केवल सादगी के लिए प्रदान किया गया है। वास्तव में, आर में एपक्लस्टर () फ़ंक्शन किसी भी मैट्रिक्स के सहसंबंधों को स्वीकार करेगा। CorSimMat () के साथ पहले भी ऐसा किया जा सकता है:

sim = cor(data, method="spearman")

या

sim = cor(t(data), method="spearman")

आप अपने मैट्रिक्स (पंक्तियों या कॉल) पर क्लस्टर करना चाहते हैं उसके आधार पर।


6

ये विधियां महान हैं लेकिन जब बहुत बड़े डेटा सेट के लिए k खोजने की कोशिश की जाती है, तो ये R में धीमी गति से पागल हो सकते हैं।

एक अच्छा समाधान जो मैंने पाया है वह "आरकेका" पैकेज है, जिसमें एक्स-मीन्स एल्गोरिदम का कुशल कार्यान्वयन है - के-मीन्स का एक विस्तारित संस्करण जो बेहतर पैमाने पर होता है और आपके लिए समूहों की इष्टतम संख्या निर्धारित करेगा।

पहले आप यह सुनिश्चित करना चाहेंगे कि वीका आपके सिस्टम पर स्थापित है और वीका को वेका के पैकेज मैनेजर टूल के माध्यम से स्थापित किया गया है।

library(RWeka)

# Print a list of available options for the X-Means algorithm
WOW("XMeans")

# Create a Weka_control object which will specify our parameters
weka_ctrl <- Weka_control(
    I = 1000,                          # max no. of overall iterations
    M = 1000,                          # max no. of iterations in the kMeans loop
    L = 20,                            # min no. of clusters
    H = 150,                           # max no. of clusters
    D = "weka.core.EuclideanDistance", # distance metric Euclidean
    C = 0.4,                           # cutoff factor ???
    S = 12                             # random number seed (for reproducibility)
)

# Run the algorithm on your data, d
x_means <- XMeans(d, control = weka_ctrl)

# Assign cluster IDs to original data set
d$xmeans.cluster <- x_means$class_ids

6

एक सरल समाधान पुस्तकालय है factoextra। आप समूहों की सबसे अच्छी संख्या की गणना के लिए क्लस्टरिंग विधि और विधि को बदल सकते हैं। उदाहरण के लिए यदि आप k- साधनों के लिए समूहों की सबसे अच्छी संख्या जानना चाहते हैं:

डेटा: mtcars

library(factoextra)   
fviz_nbclust(mtcars, kmeans, method = "wss") +
      geom_vline(xintercept = 3, linetype = 2)+
      labs(subtitle = "Elbow method")

अंत में, हमें एक ग्राफ मिलता है जैसे:

यहां छवि विवरण दर्ज करें


2

जवाब बहुत अच्छे हैं। यदि आप किसी अन्य क्लस्टरिंग विधि को मौका देना चाहते हैं तो आप पदानुक्रमित क्लस्टरिंग का उपयोग कर सकते हैं और देखें कि डेटा कैसे बंट रहा है।

> set.seed(2)
> x=matrix(rnorm(50*2), ncol=2)
> hc.complete = hclust(dist(x), method="complete")
> plot(hc.complete)

यहां छवि विवरण दर्ज करें

इस पर निर्भर करता है कि आपको कितने वर्गों की आवश्यकता है जो आपके डेंड्रोग्राम को काट सकते हैं;

> cutree(hc.complete,k = 2)
 [1] 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 2 1 1 1
[26] 2 1 1 1 1 1 1 1 1 1 1 2 2 1 1 1 2 1 1 1 1 1 1 1 2

यदि आप लिखते हैं ?cutreeतो आप परिभाषाएँ देखेंगे। यदि आपके डेटा सेट में तीन कक्षाएं हैं, तो यह बस होगा cutree(hc.complete, k = 3)। के लिए बराबर cutree(hc.complete,k = 2)है cutree(hc.complete,h = 4.9)


मैं पूरी तरह से वार्ड पसंद करते हैं।
क्रिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.