Oui, vous pouvez trouver le meilleur nombre de clusters en utilisant la méthode Elbow, mais j'ai trouvé difficile de trouver la valeur des clusters à partir du graphique elbow en utilisant script. Vous pouvez observer le graphique du coude et trouver le point du coude vous-même, mais c'était beaucoup de travail de le trouver à partir de script.
Une autre option consiste donc à utiliser Méthode de la silhouette pour le trouver. Le résultat de Silhouette est tout à fait conforme au résultat de la méthode Elbow dans R.
Voici ce que j'ai fait.
#Dataset for Clustering
n = 150
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))))
mydata<-d
#Plot 3X2 plots
attach(mtcars)
par(mfrow=c(3,2))
#Plot the original dataset
plot(mydata$x,mydata$y,main="Original Dataset")
#Scree plot to deterine the 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)
}
plot(1:15, wss, type="b", xlab="Number of Clusters",ylab="Within groups sum of squares")
# Ward Hierarchical Clustering
d <- dist(mydata, method = "euclidean") # distance matrix
fit <- hclust(d, method="ward")
plot(fit) # display dendogram
groups <- cutree(fit, k=5) # cut tree into 5 clusters
# draw dendogram with red borders around the 5 clusters
rect.hclust(fit, k=5, border="red")
#Silhouette analysis for determining the number of clusters
library(fpc)
asw <- numeric(20)
for (k in 2:20)
asw[[k]] <- pam(mydata, k) $ silinfo $ avg.width
k.best <- which.max(asw)
cat("silhouette-optimal number of clusters:", k.best, "\n")
plot(pam(d, k.best))
# K-Means Cluster Analysis
fit <- kmeans(mydata,k.best)
mydata
# get cluster means
aggregate(mydata,by=list(fit$cluster),FUN=mean)
# append cluster assignment
mydata <- data.frame(mydata, clusterid=fit$cluster)
plot(mydata$x,mydata$y, col = fit$cluster, main="K-means Clustering results")
J'espère que ça aidera !
36 votes
Ah ah... C'est vraiment le site question (sur le k-mean).
0 votes
Pouvez-vous partager le code de la fonction L (log-vraisemblance) ? Étant donné un centre à X,Y et des points à (x(i=1,2,3,4,...,n),y(i=1,2,3,4,...,n)), comment puis-je obtenir L ?
7 votes
Un lien vers l'article de Wikipedia sur le sujet : fr.wikipedia.org/wiki/
11 votes
J'ai répondu à une question similaire avec une demi-douzaine de méthodes (en utilisant
R
) par ici : stackoverflow.com/a/15376462/1036500