[cluster-analysis] k- 평균 군집화를 사용할 때 k를 어떻게 결정합니까?

k- 평균 군집화 에 대해 연구 해 왔으며 , 분명하지 않은 한 가지는 k 값을 선택하는 방법입니다. 그것은 시행 착오의 문제 일까, 아니면 더 있을까?



답변

베이지안 정보 기준 (BIC)을 최대화 할 수 있습니다.

BIC(C | X) = L(X | C) - (p / 2) * log n

여기서 L(X | C)데이터 집합의 로그 우도되는 X모델에있어서 C, p모델의 변수의 수이고 C, 그리고 n데이터 셋 포인트의 수이다. “X- 평균 : 군집 수를 효율적으로 추정하여 K- 평균 확장”을 참조하십시오 .ICML 2000에서 Dan Pelleg와 Andrew Moore의 .

또 다른 방법은 k더 이상 설명 길이가 줄어들지 않을 때까지 중심 값을 제거하고 계속 제거하는 것입니다 (k 감소). 패턴 분석 및 응용 프로그램 vol. 에서 Horst Bischof, Ales Leonardis 및 Alexander Selb의 “강력한 벡터 정량화를위한 ​​MDL 원리”를 참조하십시오 . 2, p. 1999-59-72.

마지막으로 하나의 군집으로 시작한 다음 각 군집에 지정된 점에 가우스 분포가있을 때까지 군집 분할을 유지할 수 있습니다. 에서 “배우기는 KK -means” (2003 NIPS), 그렉 Hamerly 찰스 Elkan이 작품 더 나은 BIC 이상, 그리고 그 BIC가 충분히 강하게 모델의 복잡성을 처벌하지 않는 몇 가지 증거를 보여줍니다.


답변

기본적으로 군집 수 ( k )와 군집 의 평균 분산이라는 두 변수 사이의 균형을 찾으려고 합니다. 전자를 최소화하면서 후자를 최소화하려고합니다. 물론 군집 수가 증가함에 따라 평균 분산이 감소합니다 ( k = n 의 사소한 경우까지). 및 분산 = 0 ).

데이터 분석에서 항상 그렇듯이 모든 경우에 다른 모든 방법보다 효과적인 진정한 접근 방법은 없습니다. 결국, 당신은 당신 자신의 최고의 판단을 사용해야합니다. 이를 위해 평균 분산에 대한 군집 수를 표시하는 데 도움이됩니다 (여기서 k의 여러 값에 대해 알고리즘을 이미 실행했다고 가정 ). 그런 다음 곡선의 무릎에 클러스터 수를 사용할 수 있습니다.


답변

예, 엘보우 방법을 사용하여 가장 많은 수의 클러스터를 찾을 수 있지만 스크립트를 사용하여 팔꿈치 그래프에서 클러스터의 값을 찾는 것이 번거 롭습니다. 팔꿈치 그래프를 관찰하고 팔꿈치 점을 직접 찾을 수 있지만 스크립트에서 찾는 것은 많은 작업이었습니다.

또 다른 옵션은 Silhouette Method 를 사용 하여 찾는 것입니다. Silhouette의 결과는 R의 엘보우 방법의 결과를 완전히 준수합니다.

여기 내가 한 일이 있습니다.

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

그것이 도움이되기를 바랍니다!


답변

코드 예제를 찾는 나와 같은 초보자가 될 수 있습니다. silhouette_score
에 대한 정보 는 여기에서 확인할 수 있습니다.

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

range_n_clusters = [2, 3, 4]            # clusters range you want to select
dataToFit = [[12,23],[112,46],[45,23]]  # sample data
best_clusters = 0                       # best cluster number which you will get
previous_silh_avg = 0.0

for n_clusters in range_n_clusters:
    clusterer = KMeans(n_clusters=n_clusters)
    cluster_labels = clusterer.fit_predict(dataToFit)
    silhouette_avg = silhouette_score(dataToFit, cluster_labels)
    if silhouette_avg > previous_silh_avg:
        previous_silh_avg = silhouette_avg
        best_clusters = n_clusters

# Final Kmeans for best_clusters
kmeans = KMeans(n_clusters=best_clusters, random_state=0).fit(dataToFit)


답변

그렉 Hamerly, 찰스 Elkan에 의해 “K-수단의 K 학습”, 종이. 가우스 테스트를 사용하여 올바른 클러스터 수를 결정합니다. 또한 저자는이 방법이 BIC보다 낫다고 주장합니다. 허용 된 답변에 언급되어 있습니다.


답변

Thumb of Thumb이라는 것이 있습니다. 클러스터 수는 다음과 같이 계산할 수 있다고 말합니다.

k = (n/2)^0.5

여기서 n은 샘플의 총 요소 수입니다. 다음 문서에서이 정보의 정확성을 확인할 수 있습니다.

http://www.ijarcsms.com/docs/paper/volume1/issue6/V1I6-0015.pdf

분포가 가우스 분포 또는 정규 분포를 따르는 G- 평균이라는 다른 방법도 있습니다. 모든 k 그룹이 가우스 분포를 따를 때까지 k를 증가시키는 것으로 구성됩니다. 많은 통계가 필요하지만 수행 할 수 있습니다. 소스는 다음과 같습니다.

http://papers.nips.cc/paper/2526-learning-the-k-in-k-means.pdf

이게 도움이 되길 바란다!


답변

먼저 데이터 의 최소 스패닝 트리 를 작성하십시오. 가장 비싼 K-1 모서리를 제거하면 트리가 K 클러스터로 분할
되므로 MST를 한 번 작성하고 다양한 K에 대한 클러스터 간격 / 메트릭을보고 곡선을 찾을 수 있습니다.

이것은 Single-linkage_clustering 에만 작동 하지만 빠르고 쉽습니다. 또한, MST는 좋은 시각 자료를 만듭니다.
예를 들어 클러스터링을위한 stats.stackexchange 시각화 소프트웨어 에서 MST 플롯을 참조하십시오
.