Mar*_* G. 3 java oop euclidean-distance
首先我知道欧几里得距离是什么以及它在两个向量之间做什么或计算什么。
但我的问题是关于如何计算两个类对象之间的距离,例如在 Java 或任何其他 OOP-Language 中。我读了很多关于机器学习的东西,已经使用库等编写了一个分类器,但我想知道当我有这个对象时,欧几里得距离是如何计算的:
class Object{
String name;
Color color;
int price;
int anotherProperty;
double something;
List<AnotherObject> another;
}
Run Code Online (Sandbox Code Playgroud)
我已经知道的(如果我没有错!)是我必须将此对象转换为一个(n)向量/数组表示属性或“功能”(在机器学习中调用?)
但是我该怎么做呢?这正是我需要的一块拼图,以了解更多。
我是否必须收集属性的所有可能值才能将其转换为数字并将其写入数组/向量中?
示例:
我猜上面的对象将由一个 6 维数组或更小的基于计算所需的“特征”来表示。假设颜色、名称和价格是基于以下数据的数组/向量的必要特征:
会像这样吗?
[3,324,14]
Run Code Online (Sandbox Code Playgroud)
如果我对来自同一类的每个对象都这样做,我就可以计算欧几里得距离。我是对的还是我误解了什么,还是完全错误?
对于每种数据类型,您需要选择合适的方法来确定距离。在许多情况下,每种数据类型本身也可能必须被视为向量。
例如,对于颜色,您可以将颜色表示为 RGB 值,然后取欧几里得距离(取 3 个差异,平方,求和,然后平方根)。您可能想要选择与 RGB 不同的色彩空间(例如,HSI)。请参见此处:色差。
比较两个字符串更容易:常用方法是 Levenshtein 距离。Apache commons StringUtils类中有一个方法。
数字 - 只是采取差异。
每种类型都需要考虑直接生成距离或计算数值的最佳方式,然后减去该数值以给出“距离”。
一旦您拥有每个对象所有字段的所有“值”的向量,您就可以计算欧几里得距离(差的平方,总和和总和的平方根)。
就您而言,如果您有:
object 1: [3,324,14]
object 2: [5,123,10]
Run Code Online (Sandbox Code Playgroud)
欧几里得距离为:
sqrt( (3-5)^2 + (324-123)^2 + (14-10)^2 )
Run Code Online (Sandbox Code Playgroud)
但是在比较字符串的情况下,Levenshtein 算法直接为您提供距离,而无需字段的中间数字。