Найти евклидово расстояние двух массивов разной длины - PullRequest
0 голосов
/ 24 октября 2019

Я хочу найти евклидово расстояние, чтобы проверить сходство строк.

Database Image

Сверху изображения в поле объекта рисования существует много типов изображений вбаза данных. Изображения отображаются с использованием этого поля paining_object. Теперь я хочу показать похожие изображения одного выбранного изображения, сравнивая строки из поля paining_object. Поэтому я использовал евклидово расстояние, чтобы найти сходство строк.

Но я столкнулся с проблемой длины. НапримерВ первой строке базы данных имеется четыре типа изображений в поле paining_object, а во второй строке более четырех типов изображений. Итак, как я могу измерить расстояние с помощью этого метода для массивов, имеющих неодинаковую длину.

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

неевклидовых расстояний

Расстояние между двумя неупорядоченными массивами можно перефразировать как расстояние между наборами.

Быстрый поиск показывает, что существует несколько расстояний, представляющих сходство между наборами, таких как

  • Jaccard расстояние

    d (a, b) = | a inter b |/ | объединение b |

  • метрика максимальной разности

    d (a, b) = 1 - | a inter b |/ max (| a |, | b |)

На бумаге больше расстояний (например) Расстояния между наборами по общности множеств

по-прежнему евклидово расстояние

Вы все равно можете заставить его:

Получить весь свой манг в качестве словаря V, скажем, размер n. Рассмотрим набор R^n.

Строка вашей таблицы может быть представлена ​​в виде вектора v из R^n: если строка содержит слово i, в противном случае укажите v[i] = 1, v[i]=0

Наконец, евклидово расстояние может быть тривиально применено к векторам одинаковой длины.

Таким образом, расстояние будет равно

d(a,b) = || v_b - v_a ||_2 = sqrt( (v_b[0] - v_a[0])^2 + ... + (v_b[n-1] - v_a[n-1)^2)

Каждый квадрат равен 1 тогда и только v_b[i]!=v_a[i] то есть вы хотите посчитать элементы в a, а не в b U b not in a, то есть симметричную разность a и b.

Таким образом, вы можете переписать ваше расстояние:

d(a,b) = sqrt(|a Δ b|)
1 голос
/ 24 октября 2019

Мы не можем применить Евклидово расстояние здесь, потому что:

  • Длина массива может быть разной
  • Порядок строк не должен учитываться. Например, hellsing может иметь любой индекс в массиве. Таким образом, мы не должны сравнивать первый элемент первого массива только с первым элементом второго массива.

Вместо этого мы можем определить функцию подобия, которая решает обе вышеуказанные проблемы - мыМожно использовать отношение количества совпадений строк к общему количеству комбинаций в качестве показателя сходства.

// Assuming $firstArr and $secondArr are sets, i.e., don't contain duplicates
function similarityScore($firstArr, $secondArr) {
    $matchCount = 0;
    foreach ($firstArr as $first) {
        foreach($secondArr as $second) {
            if ($first == $second) {
                $matchCount++;
            }
        }
    }
    return $matchCount/(count($firstArr)*count($secondArr));
}

Эта функция возвращает действительное число в диапазоне [0,1], где более высокое значение указывает на большее сходство.

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