首页 > 解决方案 > 两个物体之间的欧几里得距离

问题描述

首先,我知道欧几里得距离是什么以及它在两个向量之间做什么或计算什么。

但我的问题是关于如何计算两个类对象之间的距离,例如在 Java 或任何其他 OOP-Language中。我读了很多关于机器学习的东西,已经使用库等编写了分类器。但是我想知道当我有这个对象时如何计算欧几里得距离:

class Object{
    String name;
    Color color;
    int price;
    int anotherProperty;
    double something;
    List<AnotherObject> another;
}

我已经知道(如果我没记错的话!)是我必须将此对象转换为表示属性或“特征”的(n)向量/数组(在机器学习中调用?)

但是我该怎么做呢?我需要的只是这块拼图,去了解更多。

我是否必须收集属性的所有可能值才能将其转换为数字并将其写入数组/向量中?

示例

我猜上述对象将由一个 6 维数组或更小基于计算所需的“特征”表示。假设颜色、名称和价格是基于以下数据的数组/向量的必要特征:

会是这样吗?

[3,324,14]

如果我对同一类的每个对象执行此操作,我就能够计算欧几里得距离。我是对的还是我误解了什么,或者完全错了?

标签: javaoopeuclidean-distance

解决方案


对于每种数据类型,您需要选择合适的方法来确定距离。在许多情况下,每种数据类型本身也可能必须被视为向量。

例如,对于颜色,您可以将颜色表示为 RGB 值,然后取欧几里得距离(取 3 个差异,将它们平方,求和,然后平方根)。您可能想要选择与 RGB 不同的色彩空间(例如,HSI)。请参阅此处:色差

比较两个字符串更容易:一种常用方法是 Levenshtein 距离。Apache commons StringUtils类中有一个方法。

数字 - 只差一点。

每种类型都需要考虑直接生成距离或计算数值的最佳方法,然后减去该数值以给出“距离”。

一旦您拥有每个对象的所有字段的所有“值”的向量,您就可以计算欧几里得距离(差的平方、总和的平方和总和的平方根)。

在您的情况下,如果您有:

object 1: [3,324,14]
object 2: [5,123,10]

欧几里得距离为:

sqrt( (3-5)^2 + (324-123)^2 + (14-10)^2 )

但在比较字符串的情况下,Levenshtein 算法直接为您提供距离,而无需字段的中间数字。


推荐阅读