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