【问题标题】:Applying hclust on a list of distance matrices在距离矩阵列表上应用 hclust
【发布时间】:2015-10-27 12:59:13
【问题描述】:

我已尝试搜索此问题的答案,但找不到:

为了对我的数据集中的每个用户 ID(其中 385 个)执行特定的聚类,我计算了每个用户之间的欧几里得距离和地理距离向量(haversine distance)。然而,这导致了一个距离矩阵列表,我似乎无法弄清楚如何应用层次聚类。

例子

按用户 ID 拆分数据

user_id.split<-split(mydata$geodistancevector,mydata$userid)

计算每个分割的欧几里得距离

split.distances<-lapply(user_id.split,function(x) dist(x,method="euclidean"))

str(split.distances) 

结果为 385 个列表,例如

    >$ 1  :Class 'dist'  atomic [1:496] 1788.4 24.7 922.2 277.8 873.7 ...
    >.. ..- attr(*, "Size")= int 32
    >.. ..- attr(*, "Diag")= logi FALSE
    >.. ..- attr(*, "Upper")= logi FALSE
    >.. ..- attr(*, "method")= chr "euclidean"
    >``.. ..- attr(*, "call")= language dist(x = x, method = "euclidean")

    >$ 2  :Class 'dist'  atomic (0) 
     .. ..- attr(*, "Size")= int 0
     .. ..- attr(*, "Diag")= logi FALSE
     .. ..- attr(*, "Upper")= logi FALSE
     .. ..- attr(*, "method")= chr "euclidean"
      .. ..- attr(*, "call")= language dist(x = x, method = "euclidean")

等等……

如何在此距离列表中应用 hclust?我希望能够将其切割成 385(cuttree),并将其绑定回原始数据框。

谢谢!

【问题讨论】:

  • 类似lapply(lapply(split.distances, hclust), cutree)?
  • 感谢您的回复!你能再具体一点吗?我仍然无法运行代码(R 仍然很菜鸟)。如何将列表 $1$385 的每个单独距离元素上的 hclust 调用,并为每个不同的子集切割树?

标签: r matrix cluster-analysis hierarchical-clustering


【解决方案1】:

扩展我的评论; lapply 函数将接受该函数(在其第二个参数中),并在其第一个参数的每个元素上运行它。

所以要在$1$385split.distances 元素上运行hclust,我们可以简单地执行以下操作:

lapply(split.distances, hclust)

这将返回另一个列表,其中每个元素是$1$385hclust。所以要应用cutree函数,我们可以在结果上运行lapply

hclust.results <- lapply(split.distances, hclust)
cutree.results <- lapply(hclust.results, cutree)

在我的评论中,我嵌套了函数调用,将上述内容简化为:

lapply(lapply(split.distances, hclust), cutree)

【讨论】:

  • 再次感谢您的跟进!真的很感激。当我尝试上面提到的代码时,我收到一条错误消息:必须有 n>=2 个对象来聚类,所以我仍然不确定我是否遗漏了什么。
  • 看起来你的一些距离矩阵是空的(见你帖子中的元素 2)。
  • 感谢您的帮助,我删除了所有空距离矩阵 lfull&lt;-split.distances[lapply(split.distances, length) &gt; 0],并使用 hclust hclust.results &lt;- lapply(lfull, hclust) 对列表进行了聚类。但是,我不确定如何在列表中切割树(cuttree),因为我尝试的每一种方法都会出现“无效的'树'('mere'组件)错误。有没有办法在用 lapply 列出?
  • 听起来你的一些split.distances 只有一两个元素。 cutree 如果遇到具有
猜你喜欢
  • 2015-01-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 2011-08-08
  • 2019-09-04
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多