2

我正在研究最近邻搜索项目,我需要距离度量,例如 Euclidian、Manhatan 等。我可以自己实现它们,或者我想知道是否有可以使用的标准 java 代码?

谢谢

4

3 回答 3

3

曼哈顿距离很容易实现Math.abs(x1-x2)+Math.abs(y1-y2)

虽然您可以使用Point2D.distance(x1,y1,x2,y2)欧几里得距离的方法,但计算起来一点也不难:

double dx = x1-x2, dy = y1-y2;
Math.sqrt(dx*dx+dy*dy);

如果您必须将其扩展到更高的维度,请将坐标作为数组传递,并使用循环来计算平方和。

于 2012-11-14T21:30:05.917 回答
2

有些轮子太小了,以至于无法尝试不重新发明。

public class Distances
{
    private Distances() {}

    public static euclidean(double a, double b)
    {
        return Math.sqrt(a * a + b * b);
    }

    public static manhatten(double a, double b)
    {
        return Math.abs(a) + Math.abs(b);
    }
}

用法:

double x1 = 15.0, y1 = 15.0;
double x2 = 25.5, y2 = 37.25;

Distances.euclidean(x1 - x2, y1 - y2); // order does not matter
Distances.euclidean(y2 - y1, x1 - x2); // distance is the same regardless

Distances.manhatten(x1 - x2, y1 - y2);
于 2012-11-14T21:31:08.127 回答
2

看看实现 RealVector-Interfaces 的 Apaches ArrayRealVector。

那里有 L-1、L-inf 和 euklidian norm 的实现以及 n 维向量的 merik。

https://code.google.com/p/symja/source/browse/trunk/commons-math/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java?r=883

于 2012-11-14T21:40:07.513 回答