首先,我知道欧几里德距离是什么,它在两个向量之间的作用或计算结果。
但是我的问题是关于如何计算两个类对象之间的距离,例如在Java或任何其他OOP语言中。我阅读了很多有关机器学习的知识,已经使用库等编写了一个分类器。但是我想知道当我拥有这个对象时如何计算欧几里得距离:
class Object{
String name;
Color color;
int price;
int anotherProperty;
double something;
List<AnotherObject> another;
}
我所知道的(如果我没记错!)是我必须将此对象转换为表示属性或'特征”(在机器学习中称为?)
但是我该怎么做?我需要了解的只是这个难题。
我是否必须收集属性的所有可能值才能将其转换为数字并将其写入数组/向量?
示例:
我猜上面的对象将根据计算所需的“功能” 用6维数组或更小尺寸表示。 假设颜色,名称和价格是基于以下数据的数组/矢量的必要特征:
会是这样吗?
[3,324,14]
如果对同一个类中的每个对象执行此操作,则可以计算出欧几里得距离。我是对的还是我误会了什么,还是完全错了?
答案 0 :(得分:3)
对于每种数据类型,您需要选择一种确定距离的适当方法。在许多情况下,每种数据类型本身也可能必须被视为向量。
例如,对于颜色,您可以将颜色表示为RGB值,然后求出Euclidian距离(取3个差,将它们平方,求和,然后求平方根)。您可能要选择与RGB不同的颜色空间(例如,HSI)。参见此处:Colour Difference。
比较两个字符串比较容易:通用的方法是Levenshtein距离。 Apache commons StringUtils类中有一个方法。
数字-求差。
每种类型都需要考虑一些最佳方法,这些方法要么直接生成距离,要么计算一个可以减去的数字值以得出“距离”。
对于每个对象,一旦有了所有字段的所有“值”的向量,就可以计算欧几里得距离(平方和,平方和和平方根)。
在您的情况下,如果您有:
declare
cl clob;
begin
--(optional) for rec in (select * from all_views) loop
SELECT DBMS_METADATA.get_ddl ('VIEW', VIEW_NAME, VIEW_OWNER)
into cl
from dual;
dbms_output.put_line( cl);
end;
欧几里得距离是:
object 1: [3,324,14]
object 2: [5,123,10]
但是在比较字符串的情况下,Levenshtein算法可以直接为您提供距离,而无需使用中间数字。
答案 1 :(得分:0)
将此问题视为统计问题。将所有属性分类为标称,序数和比例变量。完成此操作后,这只是多维距离矢量问题。