【问题标题】:Finding the center of a cluster寻找集群的中心
【发布时间】:2010-11-18 05:39:53
【问题描述】:

我有以下问题 - 抽象出来以提出关键问题。

我有 10 个点,每个点之间有一段距离。我想要

  1. 能够找到簇的中心,即与其他点的成对距离最小的点,
    令 p(j) ~ p(k) 表示点 j 和 k 之间的成对距离
    p(i) 是集群的中心点,当且仅当 p(i) s.t. min[sum(p(j)~p(k))] for all 0
  2. 确定一旦集群中的数据点数量超过某个阈值 t,如何将集群拆分为两个集群。

这不是欧几里得空间。但是距离可以总结如下 - p(i) 是点 i:

       p(1)    p(2)    p(3)    p(4)    p(5)    p(6)    p(7)    p(8)    p(9)    p(10)
p(1)    0       2       1       3       2       3       3       2       3        4
p(2)    2       0       1       3       2       3       3       2       3        4
p(3)    1       1       0       2       0       1       2       1       2        3
p(4)    3       3       2       0       1       2       3       2       3        4      
p(5)    2       2       1       1       0       1       2       1       2        3   
p(6)    3       3       2       2       1       0       3       2       3        4   
p(7)    3       3       2       3       2       3       0       1       2        3  
p(8)    2       2       1       2       1       2       1       0       1        2 
p(9)    3       3       2       3       2       3       2       1       0        1
p(10)   4       4       3       4       3       4       3       2       1        0 

我将如何计算哪个是该集群的中心点?

【问题讨论】:

  • 请定义“集群中心”
  • @Nifle - 完成...你有什么想法
  • 应用程序与集群概念有关——我的应用程序是一个语义数据存储——点代表抽象对象。我想对对象进行聚类以便能够确定“概念”
  • 你的意思是:选择使0
  • @Jim - 换句话说,我们希望最小化集群中所有点对的成对距离。给出最小值的点是中心点。

标签: algorithm cluster-analysis data-mining


【解决方案1】:

据我了解,这看起来像 K 均值聚类,而您正在寻找的东西通常被称为“Medoids”。

请看这里:http://en.wikipedia.org/wiki/Medoids 或这里:http://en.wikipedia.org/wiki/K-medoids

【讨论】:

  • 赞成:这确实看起来像是非欧几里得指标的方法。但它至少仍然要求三角不等式成立;我承认我没有足够的耐心来验证 Ankur 的例子。
  • @Jim,三角不等式确实存在于我的“度量空间”中,所以这应该有效。
【解决方案2】:

我可能会在表现出完全愚蠢之前出现那种颤抖。但这不是很容易屈服于蛮力吗?在 Python 中:

distances = [
[ 0 , 2 , 1 , 3 , 2 , 3 , 3 , 2 , 3 , 4 , ],
[ 2 , 0 , 1 , 3 , 2 , 3 , 3 , 2 , 3 , 4 , ],
[ 1 , 1 , 0 , 2 , 0 , 1 , 2 , 1 , 2 , 3 , ],
[ 3 , 3 , 2 , 0 , 1 , 2 , 3 , 2 , 3 , 4 , ],
[ 2 , 2 , 1 , 1 , 0 , 1 , 2 , 1 , 2 , 3 , ],
[ 3 , 3 , 2 , 2 , 1 , 0 , 3 , 2 , 3 , 4 , ],
[ 3 , 3 , 2 , 3 , 2 , 3 , 0 , 1 , 2 , 3 , ],
[ 2 , 2 , 1 , 2 , 1 , 2 , 1 , 0 , 1 , 2 , ],
[ 3 , 3 , 2 , 3 , 2 , 3 , 2 , 1 , 0 , 1 , ],
[ 4 , 4 , 3 , 4 , 3 , 4 , 3 , 2 , 1 , 0 , ],
]

currentMinimum = 99999

for point in range ( 10 ) :
    distance_sum = 0
    for second_point in range ( 10 ) :
        if point == second_point : continue
        distance_sum += distances [ point ] [ second_point ]
    print '>>>>>', point, distance_sum 

    if distance_sum < currentMinimum :
        currentMinimum = distance_sum 
        centre = point

print centre

【讨论】:

  • 嗨,比尔,我也得出了类似的结论。一旦你有了你的集群并且你想选择一个集群的中心,这几乎就是这样做的方法。我正在做的是:我从单个集群开始,因为我从 1 个数据点开始,随着添加更多数据点并且我的集群变得大于某个阈值 t,我将其拆分。然后我选择两个最远的点作为新集群的中心。然后根据哪个更近,将每个点分配给两个点之一。然后计算每个簇中的实际中心。
【解决方案3】:

您正在尝试做的事情,或者至少 (b) 属于聚类分析。数学/统计学/计量经济学的一个分支,其中数据点(例如 n 维空间中的点)在组或集群之间进行划分。如何做到这一点不是一个小问题,有很多很多可能的方法。

在the wikipedia article on cluster analysis了解更多信息。

【讨论】:

    【解决方案4】:

    一)

    • 找到所有距离的中值或平均值。 = 平均所有
    • 对于每个 p,求与其他机器的平均距离。 = avgP(i)
    • 选择距离较近的一个作为中心。 avgAll ~= avgP(i)

    b) 暂时不知道。。

    也许对于每个 p,找到更接近的机器。

    按此逻辑制作图表。

    以某种方式(我还不知道)划分图表

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 2021-10-16
      相关资源
      最近更新 更多