-1

我必须设置:

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(集合 A * 集合 B)还是 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

4

2 回答 2

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
于 2013-07-14T15:10:40.877 回答
0

要在平均链接算法中找到两个集群之间的距离,您必须计算集合 A 中的每个数据点与集合 B 中的每个数据点的欧几里德距离。然后取所有距离的平均值。
所以: betweenClusterDistance = ((euclidinDistance((2, 3, 4), (4, 4, 4)) + euclidinDistance((3, 1, 3), (4, 4, 4)) + euclidinDistance((2, 5 , 4), (4, 4, 4)) + ... + euclidianDistance((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;
}
于 2015-01-24T02:49:49.837 回答