R聚类分析和具有相关矩阵的树状图
R cluster analysis and dendrogram with correlation matrix
我必须对大量数据进行聚类分析。由于我有很多缺失值,所以我制作了一个相关矩阵。
corloads = cor(df1[,2:185], use = "pairwise.complete.obs")
现在我不知道如何继续。我读了很多文章和例子,但没有什么对我有用。我怎样才能知道有多少集群适合我?
我已经试过了:
dissimilarity = 1 - corloads
distance = as.dist(dissimilarity)
plot(hclust(distance), main="Dissimilarity = 1 - Correlation", xlab="")
我得到了一个情节,但是它很乱,我不知道如何阅读它以及如何继续下去。它看起来像这样:
知道如何改进吗?我能从中得到什么?
我也想创建一个屏幕截图。我读到会有一条曲线,你可以看到有多少簇是正确的。
我也做了聚类分析,选了2-20个Clusters,但是结果太长了,不知道怎么处理,有什么要注意的。
要确定 "optimal number of clusters" 有几种方法可用,尽管这是一个有争议的主题。
kgs
有助于获得最佳的簇数。
按照您的代码可以做到:
clus <- hclust(distance)
op_k <- kgs(clus, distance, maxclus = 20)
plot (names (op_k), op_k, xlab="# clusters", ylab="penalty")
因此根据 kgs
函数的最佳聚类数是 op_k
的最小值,如您在图中所见。
你可以用
得到它
min(op_k)
请注意,我将允许的最大簇数设置为 20。您可以将此参数设置为 NULL
。
查看 this 页面了解更多方法。
希望对你有帮助。
编辑
要找到最佳的簇数,您可以这样做
op_k[which(op_k == min(op_k))]
加上
另请参阅此 post 以找到来自@Ben
的完美图形答案
编辑
op_k[which(op_k == min(op_k))]
仍然给予处罚。要找到最佳簇数,请使用
as.integer(names(op_k[which(op_k == min(op_k))]))
很高兴了解 kgs 函数。另一种选择是使用 dendextend 包中的 find_k 函数(它使用平均轮廓宽度)。但是考虑到 kgs 函数,我可能只是将它作为另一个选项添加到包中。
另请注意 dendextend::color_branches 函数,用您最终选择的簇数为您的树状图着色(您可以在此处查看更多相关信息:https://cran.r-project.org/web/packages/dendextend/vignettes/introduction.html#setting-a-dendrograms-branches)
我必须对大量数据进行聚类分析。由于我有很多缺失值,所以我制作了一个相关矩阵。
corloads = cor(df1[,2:185], use = "pairwise.complete.obs")
现在我不知道如何继续。我读了很多文章和例子,但没有什么对我有用。我怎样才能知道有多少集群适合我?
我已经试过了:
dissimilarity = 1 - corloads
distance = as.dist(dissimilarity)
plot(hclust(distance), main="Dissimilarity = 1 - Correlation", xlab="")
我得到了一个情节,但是它很乱,我不知道如何阅读它以及如何继续下去。它看起来像这样:
知道如何改进吗?我能从中得到什么?
我也想创建一个屏幕截图。我读到会有一条曲线,你可以看到有多少簇是正确的。
我也做了聚类分析,选了2-20个Clusters,但是结果太长了,不知道怎么处理,有什么要注意的。
要确定 "optimal number of clusters" 有几种方法可用,尽管这是一个有争议的主题。
kgs
有助于获得最佳的簇数。
按照您的代码可以做到:
clus <- hclust(distance)
op_k <- kgs(clus, distance, maxclus = 20)
plot (names (op_k), op_k, xlab="# clusters", ylab="penalty")
因此根据 kgs
函数的最佳聚类数是 op_k
的最小值,如您在图中所见。
你可以用
min(op_k)
请注意,我将允许的最大簇数设置为 20。您可以将此参数设置为 NULL
。
查看 this 页面了解更多方法。
希望对你有帮助。
编辑
要找到最佳的簇数,您可以这样做
op_k[which(op_k == min(op_k))]
加上
另请参阅此 post 以找到来自@Ben
的完美图形答案编辑
op_k[which(op_k == min(op_k))]
仍然给予处罚。要找到最佳簇数,请使用
as.integer(names(op_k[which(op_k == min(op_k))]))
很高兴了解 kgs 函数。另一种选择是使用 dendextend 包中的 find_k 函数(它使用平均轮廓宽度)。但是考虑到 kgs 函数,我可能只是将它作为另一个选项添加到包中。 另请注意 dendextend::color_branches 函数,用您最终选择的簇数为您的树状图着色(您可以在此处查看更多相关信息:https://cran.r-project.org/web/packages/dendextend/vignettes/introduction.html#setting-a-dendrograms-branches)