我正在研究最近邻搜索项目,我需要距离度量,例如 Euclidian、Manhatan 等。我可以自己实现它们,或者我想知道是否有可以使用的标准 java 代码?
谢谢
我正在研究最近邻搜索项目,我需要距离度量,例如 Euclidian、Manhatan 等。我可以自己实现它们,或者我想知道是否有可以使用的标准 java 代码?
谢谢
曼哈顿距离很容易实现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);
如果您必须将其扩展到更高的维度,请将坐标作为数组传递,并使用循环来计算平方和。
有些轮子太小了,以至于无法尝试不重新发明。
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);
看看实现 RealVector-Interfaces 的 Apaches ArrayRealVector。
那里有 L-1、L-inf 和 euklidian norm 的实现以及 n 维向量的 merik。