使用平均链接进行聚类

时间:2013-07-14 11:13:18

标签: cluster-analysis

我必须设置:

A = {(2, 3, 4), (3, 1, 3), (2, 5, 4)}
B = {(4, 4, 4), (3, 7, 3)}

我现在想知道平均链接,但实际上我不知道 知道用哪个集合计算。

dist_al(A, B) = 1 / (|A| * |B|) * SUM dist(x, y)

此示例中的|A| * |B|是什么?它是3 * 2(在集合B中设置A *集合)还是9 * 6(每个数字)?

如果它是我得到的第一个:

  

1/6 * (2 + 2+ 2+ 1+ 5+ 1+ 1+ 1+ 1+ 4+ 1+ 3+ 1+ 1+ 1+ 1+ 4+ 3+ 3+ 3+ 2+ 6+ 2+ 1+ 1+ 1+ 4+ 2+ 2+ 2+ 1+ 5+ 1+ 1+ 1+ 1+ 2+ 2+ 2+ 1+ 3+ 1)

=> 14,16

如果是第二个我

  

1/54 * (2 + 2+ 2+ 1+ 5+ 1+ 1+ 1+ 1+ 4+ 1+ 3+ 1+ 1+ 1+ 1+ 4+ 3+ 3+ 3+ 2+ 6+ 2+ 1+ 1+ 1+ 4+ 2+ 2+ 2+ 1+ 5+ 1+ 1+ 1+ 1+ 2+ 2+ 2+ 1+ 3+ 1)

=> 1,5

2 个答案:

答案 0 :(得分:2)

在通用的数学符号中,|A|是集A中元素的数量 即|{ Apple, Banana, Obama }| = 3,假设这些是三个不同的对象。

由于有6对成对距离,除以6也是显而易见的选择。

请注意,存在两种不同的“平均”联系。这些名字在书本之间略有不同。 UPGMA和WPGMA有一些明确的定义,看看这些!

哦,请注意,在实施层次聚类时,通常会使用此公式 计算它,而是使用基于之前结果的更新公式。

因此,平均连锁(使用欧几里德距离)是:

sum(2.2360679775 4.24264068712 3.31662479036
    6.0          2.2360679775  2.44948974278)/6
= 3.4134818625433332

答案 1 :(得分:0)

要在avgerage-linkage算法中找到两个聚类之间的距离,您必须计算A组中每个数据点与组B中每个数据点的欧几里德距离。然后取所有距离的平均值。
所以: betweenClusterDistance =((euclidinDistance((2,3,4),(4,4,4))+ euclidinDistance((3,1,3),(4,4,4))+ euclidinDistance((2,5,4) ),(4,4,4))+ ... +欧几里德距离((2,5,4),3,7,3)))/(欧几里德距离调用次数))

看看以下代码:

public static double findClusterDistance(ClusterObject cluster1,
        ClusterObject cluster2) {
    double distance = 0.0;
    int itt = 0;
    for (DataObject data1 : cluster1.getClusterList()) {
        for (DataObject data2 : cluster2.getClusterList()) {
            itt++;
            distance += getEuclidianDistance(data1.getDimensions(),
                    data2.getDimensions());
        }
    }
    return distance / itt;
}

public static double getEuclidianDistance(List<Double> list1,
        List<Double> list2) {
    double euclidianDistance = 0.0;
    double partialDistance = 0.0;
    for (int i = 0; i < list1.size(); i++) {
        partialDistance += Math.pow(list2.get(i) - list1.get(i), 2);
    }
    euclidianDistance = Math.sqrt(partialDistance);
    return euclidianDistance;
}