Евклидово расстояние между двумя объектами

Прежде всего я знаю, что такое евклидово расстояние и что оно делает или вычисляет между двумя векторами.

Но мой вопрос о том, как рассчитать расстояние между двумя объектами класса, например, на Java или любом другом языке ООП. Я читал довольно много материала о машинном обучении, уже написал классификатор с использованием библиотек и т.д., но я хочу знать, как рассчитывается евклидово расстояние, когда у меня есть, например, этот объект:

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

Что я уже знаю (если я не ошибаюсь!), так это то, что мне нужно преобразовать этот объект в (n) вектор / массив, представляющий свойства или 'Возможности' ( называется в машинном обучении?)

Но как я могу это сделать? Это как раз этот кусок головоломки, который мне нужен, чтобы понять еще больше.

Нужно ли мне собирать все возможные значения свойства, чтобы преобразовать его в число и записать в массив / вектор?

Пример:

Я предполагаю, что вышеупомянутый объект будет представлен 6-мерным массивом или меньше на основе «функций», которые необходимы для расчета. Допустим, цвет, имя и цена - это те необходимые характеристики массива / вектора на основе следующих данных:

  • цвет: зеленый (допустим, перечисление с 5 возможными значениями, где зеленый - третье)
  • name: "foo" (я бы не знал, как преобразовать это, возможно, добавив ascii-код?)
  • цена: 14 (взять целое число?)

будет выглядеть так?

[3,324,14]

И если я сделаю это с каждым объектом из того же класса, я смогу вычислить евклидово расстояние. Прав ли я, или я что-то неправильно понял, или это совершенно неправильно?


person Markus G.    schedule 25.01.2019    source источник
comment
Я не знаю, какую проблему вы пытаетесь решить, но я не могу представить сценарий, в котором было бы полезно ваше решение с добавлением кодов ascii. У вас будет такое же значение для строк 22 и d.   -  person NeplatnyUdaj    schedule 25.01.2019
comment
Имя - это одна из категорий, или это может быть что угодно? Что означает близость двух имен? Есть ли в этом вообще смысл? Связаны ли как-то похожие имена?   -  person kutschkem    schedule 25.01.2019
comment
В настоящее время у меня нет проблем, которые нужно решить. Я хочу понять, как я могу правильно преобразовать объект со свойствами в вектор, а затем применить евклидиан. Что вы имеете в виду под "22" и "d"   -  person Markus G.    schedule 25.01.2019
comment
@kutschkem имя может быть любым, но я знаю, что было бы глупо включать имя как функцию, если это может быть что угодно. Просто пример   -  person Markus G.    schedule 25.01.2019
comment
Вы столкнулись с довольно серьезной проблемой машинного обучения. Что касается текстовых различий, не используйте функцию евклидова расстояния. Вместо этого используйте косинусное сходство: todatascience.com/   -  person Erik    schedule 25.01.2019


Ответы (2)


Для каждого типа данных нужно выбрать подходящий метод определения расстояния. Во многих случаях каждый тип данных может также рассматриваться как вектор.

Для цвета, например, вы можете выразить цвет как значение RGB, а затем взять евклидово расстояние (возьмите 3 разницы, возведите их в квадрат, суммируйте и затем извлеките квадратный корень). Возможно, вы захотите выбрать цветовое пространство, отличное от RGB (например, HSI). См. Здесь: Разница в цвете.

Сравнивать две строки проще: распространенным методом является расстояние Левенштейна. В сообществе Apache есть метод StringUtils.

Цифры - вот разница.

Каждый тип потребует некоторого внимания к лучшему способу либо прямого создания расстояния, либо вычисления числового значения, которое затем может быть вычтено для получения «расстояния».

Когда у вас есть вектор всех «значений» всех полей для каждого объекта, вы можете вычислить евклидово расстояние (разницы возвести в квадрат, суммировать и извлечь квадратный корень из суммы).

В вашем случае, если у вас есть:

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

Евклидово расстояние:

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

Но в случае сравнения строк алгоритм Левенштейна дает вам расстояние напрямую без промежуточных чисел для полей.

person rghome    schedule 25.01.2019
comment
Звучит здорово. Что вы имеете в виду под квадратом разностей, суммой и квадратным корнем из суммы. Трудно понять это. Можете сформулировать, пожалуйста? - person Markus G.; 25.01.2019
comment
Просто убедитесь, что это расстояние полностью соответствует равенству треугольника. Это зависит от алгоритма, но в целом это ожидается от меры расстояния. - person kutschkem; 25.01.2019
comment
Это просто Пифагор. См. en.wikipedia.org/wiki/Euclidean_distance. - person rghome; 25.01.2019
comment
@MarkusG. Это означает, что вместо distance = sqrt( (a1-b1)^2 + (a2-b2)^2) ) вы делаете distance = sqrt( distance1(a1,b1)^2 + distance2(a2,b2)^2 ) - person kutschkem; 25.01.2019
comment
Хорошо, спасибо, трудно понять, это не мой родной язык. Звучит хорошо, я попробую - person Markus G.; 25.01.2019

Подумайте об этой проблеме как о проблеме статистики. Классифицируйте все атрибуты на номинальные, порядковые и масштабные переменные. Как только вы это сделаете, это просто проблема с многомерным вектором расстояния.

person Vinay Avasthi    schedule 25.01.2019