群集中点之间的平均距离

时间:2009-10-31 22:49:31

标签: distance

听起来我有了这个概念,但似乎无法使实现正确。 eI有一个有多个点的簇(一个ArrayList),我想计算平均距离。例如:群集中的点(A,B,C,D,E,F,...,n),距离AB,距离AC,距离AD,...距离A,N,距离(B,C)距离( B,D)......距离(B,N)......

提前致谢。

2 个答案:

答案 0 :(得分:2)

您不希望对任何段重复计算,因此您的算法应该是双循环。外部循环从A到M(你不需要检查N,因为它没有任何东西可以连接),每次从curPoint循环到N,计算每个距离。您添加所有距离,并除以点数(n-1)^ 2/2。应该很简单。

我没有任何标准算法可以改进这一点,而且这不是一个广泛研究的问题。我猜你可以通过从每个点到少数其他点的距离采样得到一个非常合理的估计(如果估计是有用的)。但这是猜测。

(看到你的代码示例后)这是另一个尝试:

public double avgDistanceInCluster() { 
    double totDistance = 0.0; 
    for (int i = 0; i < bigCluster.length - 1; i++) { 
        for (int j = i+1; j < bigCluster.length; j++) { 
            totDistance += distance(bigCluster[i], bigCluster[j]);
        }
    }
    return totDistance / (bigCluster.length * (bigCluster.length - 1)) / 2; 
}

请注意,第一个循环的限制是不同的。 两点之间的距离可能是sqrt((x1 - x2)^2 + (y1 -y2)^2)

答案 1 :(得分:0)

谢谢所有帮助,有时候在论坛上解答问题答案后,只需弹出一下即可。这就是我最终要做的事情。

我有一个点集群,我需要计算集群中点(对)的平均距离。所以,这就是我所做的。我相信有人会得到一个更好的答案,如果是这样,请留言。提前致谢。

/**
 * Calculate avg distance between points in cluster
 * @return
 */
public double avgDistanceInCluster() {
    double avgDistance = 0.0;
    Stack<Double> holder = new Stack<Double>();
    for (int i = 0; i < cluster.size(); i++) {
        System.out.println(cluster.get(i));
        for (int j = i+1; j < cluster.size(); j++) {
            avgDistance = (cluster.get(i) + cluster.get(j))/2; 
            holder.push(avgDistance);
        }
    }
    Iterator<Double> iter = holder.iterator();
    double avgClusterDist = 0;
    while (iter.hasNext()) {
        avgClusterDist =+ holder.pop();
        System.out.println(avgClusterDist);
    }
    return avgClusterDist/cluster.size();
}
相关问题