作为R的新手,我不太确定如何选择最佳数量的聚类来进行k均值分析 . 绘制下面数据的子集后,适合多少个群集?如何进行聚类dendro分析?
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 )
7 回答
为了确定聚类方法中的最优k-聚类 . 我通常使用
Elbow
方法伴随并行处理以避免时间消耗 . 此代码可以像这样样本:Elbow method
Running Elbow parallel
它运作良好 .
这些方法很棒但是当试图为更大的数据集找到k时,这些在R中可能会很慢 .
我发现的一个很好的解决方案是“RWeka”软件包,它具有X-Means算法的有效实现 - K-Means的扩展版本可以更好地扩展,并将为您确定最佳的簇数 .
首先,您需要确保在您的系统上安装了Weka,并通过Weka的软件包管理器工具安装了XMeans .
答案很棒 . 如果您想有机会使用其他聚类方法,可以使用层次聚类并查看数据如何拆分 .
根据您需要的课程数量,您可以将树形图剪切为;
如果键入
?cutree
,您将看到定义 . 如果您的数据集有三个类,那么它将只是cutree(hc.complete, k = 3)
.cutree(hc.complete,k = 2)
的等价物是cutree(hc.complete,h = 4.9)
.一个简单的解决方案是库
factoextra
. 您可以更改聚类方法和计算最佳组数的方法 . 例如,如果您想知道k-的最佳簇数:数据:mtcars
最后,我们得到一个图形:
本的精彩回答 . 然而,我很惊讶这里建议的亲和传播(AP)方法只是为了找到k-means方法的簇数,其中一般来说AP可以更好地聚类数据 . 请参阅Science中支持此方法的科学论文:
Frey, Brendan J., and Delbert Dueck. "Clustering by passing messages between data points." science 315.5814 (2007): 972-976.
因此,如果您不偏向k-means,我建议直接使用AP,这将集中数据,而无需知道集群的数量:
如果负欧氏距离不合适,则可以使用同一包中提供的其他相似性度量 . 例如,对于基于Spearman相关性的相似性,这就是您所需要的:
请注意,AP包中的相似功能仅为简单起见而提供 . 事实上,R中的apcluster()函数将接受任何相关矩阵 . 使用corSimMat()之前也可以这样做:
要么
取决于您想要在矩阵(行或列)上聚类的内容 .
如果您的问题是
how can I determine how many clusters are appropriate for a kmeans analysis of my data?
,那么这里有一些选项 . 确定簇数的wikipedia article对其中一些方法有很好的回顾 .首先,一些可重现的数据(Q中的数据......我不清楚):
One . 在平方误差(SSE)碎石图中寻找弯曲或弯头 . 有关详细信息,请参阅http://www.statmethods.net/advstats/cluster.html和http://www.mattpeeples.net/kmeans.html . 在结果图中肘部的位置表明适合kmeans的簇的数量:
我们可以得出结论,这种方法将表明4个集群:
Two . 您可以使用fpc包中的
pamk
函数对medoids进行分区以估计簇的数量 .Three . Calinsky准则:另一种诊断适合数据的簇数的方法 . 在这种情况下,我们尝试1到10组 .
Four . 根据贝叶斯信息准则确定最优模型和聚类数量,用于期望最大化,通过参数化高斯混合模型的层次聚类初始化
Five . 亲和传播(AP)聚类,请参阅http://dx.doi.org/10.1126/science.1136800
Six . 用于估计群集数量的差距统计 . 另见some code for a nice graphical output . 在这里尝试2-10个集群:
这里's the output from Edwin Chen'执行差距统计:
Seven . 您可能还发现使用群集集探索数据以显示群集分配很有用,有关详细信息,请参阅http://www.r-statistics.com/2010/06/clustergram-visualization-and-diagnostics-for-cluster-analysis-r-code/ .
Eight . NbClust package提供30个索引来确定数据集中的簇数 .
如果你的问题是
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-analysis http://gastonsanchez.wordpress.com/2012/10/03/7-ways-to-plot-dendrograms-in-r/并在这里看到更多奇特的方法:http://cran.r-project.org/web/views/Cluster.html这里有一些例子:
此外,对于高维数据,
pvclust
库通过多尺度引导程序重采样计算层次聚类的p值 . 这是文档中的示例(不会像我的文档那样处理如此低维数据例):这有什么帮助吗?
很难添加一些如此精细的答案 . 虽然我觉得我们应该在这里提到
identify
,特别是因为@Ben显示了很多树形图的例子 .identify
允许您以交互方式从树形图中选择聚类,并将您的选择存储到列表中 . 点击Esc退出交互模式并返回R控制台 . 请注意,该列表包含索引,而不是rownames(与cutree
相对) .