Diana(Divisive Analysis Clustering)是一种层次聚类算法,它通过递归地将数据集分割成较小的簇来工作。在R语言的cluster
包中,diana
函数可以用来执行这种聚类。要确定最优的聚类数,你可以使用几种不同的方法,包括轮廓系数(Silhouette Coefficient)、Davies-Bouldin指数、Calinski-Harabasz指数等。
以下是如何使用diana
函数以及如何评估最优聚类数的步骤:
cluster
包install.packages("cluster")
library(cluster)
diana
函数进行聚类假设你有一个数据框df
,你可以使用diana
函数对其进行聚类:
set.seed(123) # 设置随机种子以便结果可复现
diana_result <- diana(df)
轮廓系数结合了聚类的凝聚度和分离度,其值范围通常在-1到1之间,值越大表示聚类效果越好。
library(factoextra)
# 计算不同聚类数下的轮廓系数
silhouette_scores <- numeric()
for (k in 2:10) { # 假设你想检查2到10个簇
diana_k <- cutree(diana_result, k = k)
score <- silhouette(diana_k, dist(df))
silhouette_scores[k] <- mean(score[, "sil_width"])
}
# 找到最大轮廓系数的聚类数
optimal_clusters <- which.max(silhouette_scores) + 1 # 加1是因为我们从2开始检查
print(paste("Optimal number of clusters:", optimal_clusters))
Davies-Bouldin指数越小,聚类效果越好。
db_scores <- numeric()
for (k in 2:10) {
diana_k <- cutree(diana_result, k = k)
score <- index.DB(df, diana_k, centrotypes = "medoids")
db_scores[k] <- score$DB
}
# 找到最小Davies-Bouldin指数的聚类数
optimal_clusters_db <- which.min(db_scores) + 1
print(paste("Optimal number of clusters (Davies-Bouldin):", optimal_clusters_db))
Calinski-Harabasz指数越大,聚类效果越好。
ch_scores <- numeric()
for (k in 2:10) {
diana_k <- cutree(diana_result, k = k)
score <- index.G1(df, diana_k, diana_result$medoids, centrotypes = "medoids")
ch_scores[k] <- score$value
}
# 找到最大Calinski-Harabasz指数的聚类数
optimal_clusters_ch <- which.max(ch_scores) + 1
print(paste("Optimal number of clusters (Calinski-Harabasz):", optimal_clusters_ch))
你可以使用factoextra
包中的函数来可视化聚类结果和评估指标的变化趋势。
fviz_nbclust(df, FUNcluster = diana, method = "silhouette") +
theme_minimal()
通过上述步骤,你可以评估不同聚类数下的聚类效果,并选择最优的聚类数。
领取专属 10元无门槛券
手把手带您无忧上云