【问题标题】:Clustering by distance in RR中的距离聚类
【发布时间】:2013-06-21 15:37:10
【问题描述】:

我有一个整数向量,我希望将其分成簇,以便任何两个簇之间的距离大于下限,并且在任何簇内,两个元素之间的距离小于上限。

例如,假设我们有以下向量:

1、4、5、6、9、29、32、36

并将上述下界和上界分别设置为19和9,下面的两个向量应该是可能的结果:

1、4、5、6、9

29、32、36


感谢@flodel 的 cmets,我意识到这种聚类可能是不可能的。所以我想稍微修改一下问题:

如果我只施加 between 聚类距离下限,有哪些可能的聚类方法? 如果我只强加 within 聚类距离上限,有哪些可能的聚类方法?

【问题讨论】:

  • 如果边界之间有距离会发生什么?
  • 如果我将20 添加到您的向量中,您的问题会变得不可行吗?你不能同时拥有这两个条件。换句话说,您是否正在寻找一种算法,它会告诉您何时无法满足这两个条件,或者您是否没有意识到这种可能性?在这种情况下,您可能需要重新考虑您的问题。

标签: r cluster-analysis


【解决方案1】:

如果我只施加聚类间距离下限,有哪些可能的聚类方法?

具有单链接的层次聚类:

x <- c(1, 4, 5, 6, 9, 29, 32, 46, 55)
tree <- hclust(dist(x), method = "single")
split(x, cutree(tree, h = 19))

# $`1`
# [1] 1 4 5 6 9
# 
# $`2`
# [1] 29 32 46 55

如果我只施加聚类内距离上限,有哪些可能的聚类方法?

具有完整链接的层次聚类:

x <- c(1, 4, 5, 6, 9, 20, 26, 29, 32)
tree <- hclust(dist(x), method = "complete")
split(x, cutree(tree, h = 9))

# $`1`
# [1] 1 4 5 6 9
# 
# $`2`
# [1] 20
# 
# $`3`
# [1] 26 29 32

【讨论】:

    【解决方案2】:

    这是一个可行的简单算法,从概念上解释(省略实现细节):

    1. 确保您的列表已排序。
    2. 在每对超过lower_bound 的连续元素之间放置一个“标记”。这些标记了所有可能的集群边界。
    3. 在列表开头之前和结尾之后添加一个标记。
    4. 按顺序遍历标记对,对于每一对 left_markerright_marker,检查紧邻 left_marker 右侧的元素与紧邻 @987654325 左侧的元素之间的距离@ 小于 upper_bound
    5. 如果上一步返回 false,则无法进行聚类。
    6. 否则,标记会形成所需聚类的边界。

    将此应用于您的示例,我们得到:

    1. 排序:1、4、5、6、9、26、29、32
    2. 标记:1、4、5、6、9 | 26、29、32
    3. 额外的开始/结束标记:| 1, 4, 5, 6, 9 | 26、29、32 |
    4. 检查“上限”约束:(9-1) = 8
    5. 没有一个比较返回 false
    6. 所需的聚类:(1, 4, 5, 6, 9), (26, 29, 32)

    编辑:原始发帖人放宽了问题的条件。

    如果只想满足下界条件:

    1. 确保您的列表已排序。
    2. 在每对超过lower_bound 的连续元素之间放置一个标记。
    3. 在开始之前和结束之后添加一个标记。
    4. 这些标记构成了所需聚类的边界。

    假设您的向量已经排序,以下将引导您执行第 2 步:

    # Given
    vec <- c(1, 4, 5, 6, 9, 29, 32, 26)
    lower_bound <- 19
    
    f <- function(x) {
      return(vec[x+1] - vec[x] > lower_bound);
    }
    indices <- seq(length(vec)-1)
    marker_positions <- Position(f, indices)
    

    【讨论】:

    • 谢谢。我已经对您的答案投了赞成票,它非常清楚且很有帮助,但问题是在 R 中寻找一种实用的方法,如果现有的函数或包已经可以做到这一点,我们将不胜感激。另外,由于在某些情况下可能无法在两个边界条件下进行聚类,因此我对问题进行了一些编辑,请您看一下吗?谢谢! :)
    • 其实,也许我不明白你原来的问题。 9和26之间的距离只有17,小于19。这应该怎么算正确的聚类?
    • @AmitKumarGupta 但是如果你将 20 添加到数字列表中呢?你的算法仍然正确吗?
    • 是的,它不会产生任何标记位置,所以在执行第 3 步之后,您将拥有的唯一标记是开始的左侧和结束的右侧,这意味着所有元素都属于一个集群等于整个原始向量。
    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 2015-09-22
    • 2016-01-10
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2012-09-05
    • 2016-03-20
    相关资源
    最近更新 更多