2017-05-08 78 views
0

我目前正在关注文档主题中的层次结构。作为第一步,我找到了我的文档的向量表示,然后使用分层聚类来确定文档的主题内是否有主题。我只想考虑(嵌套的)至少包含2个原始数据的集群。为了达到这个目的,我使用R.获取集群层次结构和嵌套集群分配

现在,我正在努力从聚类结果中有效地提取集群层次结构。集群使用“fastcluster”软件包完成,它提供与原始“hclust”功能类似的结果。

对于我的最终输出应该看起来像这样;将有两个表

集群分配:

docID , ClusterLabel 
1, A 
2, A 
3, B 
4, B 
5, B 
3, C 
4, D 
5, C 
... 

集群层次:

Parent, Child 
B, C 
B, D 
... 

正如你所看到的,观察3,4和5发生在集群分配表多次,其中一个群集是其父群集的子群集。这可以在Hierarchy表中看到。

我目前的方法是使用“Dendextend”包中的cutree.dendogram函数来查找k值网格的聚类分配,然后从输出中推导聚类分层结构和分配。然而,这种方法非常天真,对于大量的观测和聚类变得非常缓慢。

有关如何有效解决此问题的建议,最好使用一些现成的软件包将不胜感激。

编辑:考虑下面的例子中,对应于所述采样输出数据:

data <- matrix(data = c(1,2,3,4,5,1,3,5,9,10), nrow = 5, ncol = 2) 
plot(data) 

hc<- hclust(dist(data)) 
plot(hc) 

如果我们将削减树在高度6,我们将获得2簇,在输出命名为A和B.但是,如果我们在高度为4的树上砍树,我们将有3个簇,输出中命名为A,C和D.现在,例如,docID 3的观察结果在集群B中与集群C中(取决于我们切割树的高度)相对应,这与样本输出集群分配中的两个条目相对应。集群B分为两个集群C和D,这可以在集群Hierachy输出中看到。

现在我的目标是获取聚类分配和层次结构的完整列表,向下移动树状图。 (最好在(子)簇中的观测量少于一定量的观测值时停止)

直到现在我还没有想出一个合理有效的方法来做到这一点,希望任何人都可以提供给我一个理念。

+0

Hi @ Bartdp1,你能否用一个自包含可重现的例子更新你的问题? –

+0

@TalGalili @TalGalili我更新了这个问题,感谢您看看 – BDP1

回答

1

cutree功能k参数可接收值的向量和输出应该是这样的:

> data <- matrix(data = c(1,2,3,4,5,1,3,5,9,10), nrow = 5, ncol = 2) 
> hc<- hclust(dist(data)) 
> cutree(hc, k = 1:5) 
    1 2 3 4 5 
[1,] 1 1 1 1 1 
[2,] 1 1 1 2 2 
[3,] 1 1 2 3 3 
[4,] 1 2 3 4 4 
[5,] 1 2 3 4 5 

这是否回答你的问题?

+0

不完全是,请注意,当从2个簇到3个簇时,第2列中的簇“1”被拆分为两个簇,分别命名为簇“1”和簇“2”在第3栏。后两个是第一个“孩子”。我想保持两者之间的区别,所以他们应该有不同的标签(现在,情况并非如此,因为标签“1”出现两次)。 当然,我可以看到可以从您提供的输出中得出所有这些信息,但考虑到树状图很容易获得这些信息,这可能相当昂贵。我只是看不到如何有效地提取它。 – BDP1

+0

我不确定我关注。你想要第二列只有2和3,第三列有3,4,5 - 等等? –

+0

不支持。起初,我正在寻找从hclust输出中提取原始问题中显示的示例输出。所以我想要一个列表集群分配。观察在这个列表中多次出现,因为当一个clusers在层级聚类中合并时,观察结果既在“父”又在“子”聚类中。此外,我想获得一个partent-> child关系清单。为了记录,我不确定dendextend是否具有此功能(或部分功能将被使用),但我希望能够在正确的方向上推动如何有效地对此进行编码。 – BDP1