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

Таблица включает в себя несколько известных мер расстояния, в том числе евклидово расстояние, манхэттенское расстояние, косинусное подобие, расстояние Минковского, расстояние Хэмминга, расстояние Левенштейна, подобие Жаккара, расстояние Махаланобиса, расстояние Хаверсина, индекс Серенсена-Дайса, расстояние Чебышева, корреляцию Пирсона, квадрат Евклидово расстояние, дивергенция Дженсена-Шеннона, расстояние хи-квадрат, корреляция Спирмена и расстояние Канберры.

Евклидово расстояние — это наиболее часто используемая мера расстояния в машинном обучении и науке о данных. Он вычисляет расстояние по прямой между двумя точками в n-мерном пространстве. Евклидово расстояние полезно при сравнении числовых данных, которые хорошо подходят для декартовых координат.

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

Сходство по косинусу – это популярная мера расстояния для сравнения сходства между двумя векторами. Он измеряет косинус угла между двумя векторами и полезен при работе с текстовыми данными, например, в приложениях для обработки естественного языка.

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

Чебышёвское расстояние — это мера максимальной разницы между элементами двух векторов. Это полезно при работе с многомерными данными или в задачах оптимизации.

Расстояние Хэмминга используется для измерения разницы между двумя двоичными векторами и подсчитывает количество позиций, в которых соответствующие биты различаются. Эта мера обычно используется в кодах с исправлением ошибок, сетевом кодировании и секвенировании ДНК.

Расстояние Левенштейна используется для измерения разницы между двумя последовательностями, такими как строки, и вычисляет минимальное количество вставок, удалений или замен, необходимых для преобразования одной последовательности в другую. Эта мера расстояния полезна в приложениях для проверки орфографии или выравнивания последовательности ДНК.

Сходство по Жаккару — это мера сходства между двумя наборами. Он вычисляет размер пересечения между двумя множествами, разделенный на размер их объединения. Эта мера полезна в системах классификации текстов или рекомендаций.

Индекс Соренсена-Дайса — это еще одна мера подобия, используемая для сравнения сходства между двумя наборами. Он вычисляет количество общих элементов в двух наборах, деленное на общее количество элементов в обоих наборах. Эта мера полезна при распознавании изображений, кластеризации данных и поиске информации.

Расстояние гаверсинус используется для расчета расстояния между двумя точками на поверхности сферы, например Земли. Он обычно используется в геопространственных приложениях, таких как GPS-навигация.

Расстояние Махаланобиса – это мера расстояния между точкой и распределением с учетом ковариационной структуры данных. Это полезно при обнаружении аномалий, кластеризации и классификации.

Корреляция Пирсона — это мера линейной зависимости между двумя переменными. Он широко используется в статистике и анализе данных.

Квадрат евклидова расстояния – это вариант евклидова расстояния, который вычисляет квадрат разницы между двумя векторами. Эта мера полезна при сравнении двух векторов с похожими значениями.

Расхождение Дженсена-Шеннона – это мера сходства между двумя распределениями вероятностей. Он обычно используется при обработке естественного языка, распознавании изображений и кластеризации данных.

Расстояние Хи-квадрат – это мера разницы между двумя распределениями вероятностей. Он широко используется в машинном обучении и анализе данных.

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

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

вот фрагмент кода, который демонстрирует, как вычислить каждую из этих мер расстояния в Python:

import numpy as np
import jellyfish
from scipy.spatial import distance
from scipy.spatial.distance import cdist
from scipy.stats import pearsonr, spearmanr, chisquare
from scipy.spatial.distance import canberra, cosine, euclidean, minkowski, cityblock, hamming, jaccard, dice, braycurtis
from sklearn.metrics.pairwise import paired_distances
from scipy.special import rel_entr

# Euclidean distance
def euclidean_distance(p1, p2):
    return np.sqrt(np.sum((p1 - p2) ** 2))

# Manhattan distance
def manhattan_distance(p1, p2):
    return np.sum(np.abs(p1 - p2))

# Cosine similarity
def cosine_similarity(p1, p2):
    return 1 - distance.cosine(p1, p2)

# Minkowski distance
def minkowski_distance(p1, p2, r):
    return np.power(np.sum(np.power(np.abs(p1 - p2), r)), 1/r)

# Chebyshev distance
def chebyshev_distance(p1, p2):
    return np.max(np.abs(p1 - p2))

# Hamming distance
def hamming_distance(s1, s2):
    return jellyfish.hamming_distance(s1, s2)

# Levenshtein distance
def levenshtein_distance(s1, s2):
    return jellyfish.levenshtein_distance(s1, s2)

# Jaccard similarity
def jaccard_similarity(s1, s2):
    set1 = set(s1)
    set2 = set(s2)
    intersection = set1.intersection(set2)
    union = set1.union(set2)
    return len(intersection) / len(union)

# Sørensen-Dice index
def sorensen_dice_index(s1, s2):
    set1 = set(s1)
    set2 = set(s2)
    intersection = set1.intersection(set2)
    return (2 * len(intersection)) / (len(set1) + len(set2))

# Haversine Distance
def haversine_distance(lat1, lon1, lat2, lon2):
    R = 6371.0 # Radius of the earth in km
    dLat = np.deg2rad(lat2 - lat1)
    dLon = np.deg2rad(lon2 - lon1)
    a = np.sin(dLat / 2)**2 + np.cos(np.deg2rad(lat1)) * np.cos(np.deg2rad(lat2)) * np.sin(dLon / 2)**2
    c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1 - a))
    return R * c

# Mahalanobis distance
def mahalanobis_distance(X, Y):
    return cdist(X.reshape(1,-1), Y.reshape(1,-1), 'mahalanobis', VI=np.cov(X))

# Pearson Correlation
def pearson_correlation(X, Y):
    return pearsonr(X, Y)[0]

# Squared Euclidean Distance
def squared_euclidean_distance(X, Y):
    return euclidean(X, Y)**2

# Jensen-Shannon Divergence
def jensen_shannon_divergence(X, Y):
    M = 0.5 * (X + Y)
    return np.sqrt(0.5 * (rel_entr(X, M).sum() + rel_entr(Y, M).sum()))

# Chi-Square Distance
def chi_square_distance(X, Y):
    # Normalize the arrays
    X = X / np.sum(X)
    Y = Y / np.sum(Y)
    
    # Calculate chi-square distance
    return np.sum((X - Y) ** 2 / (X + Y))

# Spearman Correlation
def spearman_correlation(X, Y):
    return spearmanr(X, Y)[0]

# Canberra Distance
def canberra_distance(X, Y):
    return canberra(X, Y)

# Example usage
point1 = np.array([1, 2])
point2 = np.array([3, 4])
string1 = "hello"
string2 = "hallo"

print("Euclidean distance:", euclidean_distance(point1, point2))
print("Manhattan distance:", manhattan_distance(point1, point2))
print("Cosine similarity:", cosine_similarity(point1, point2))
print("Minkowski distance:", minkowski_distance(point1, point2, 3))
print("Chebyshev distance:", chebyshev_distance(point1, point2))
print("Hamming distance:", hamming_distance(string1, string2))
print("Levenshtein distance:", levenshtein_distance(string1, string2))
print("Jaccard similarity:", jaccard_similarity(string1, string2))
print("Sørensen-Dice index:", sorensen_dice_index(string1, string2))
print("Haversine distance:", haversine_distance(51.5074, 0.1278, 40.7128, -74.0060))
print("Mahalanobis distance:", mahalanobis_distance(point1, point2))
print("Pearson correlation:", pearson_correlation(point1, point2))
print("Squared Euclidean distance:", squared_euclidean_distance(point1, point2))
print("Jensen-Shannon divergence:", jensen_shannon_divergence(point1, point2))
print("Chi-Square distance:", chi_square_distance(point1, point2))
print("Spearman correlation:", spearman_correlation(point1, point2))
print("Canberra distance:", canberra_distance(point1, point2))
Euclidean distance: 2.8284271247461903 
Manhattan distance: 4 
Cosine similarity: 0.9838699100999074 
Minkowski distance: 2.5198420997897464 
Chebyshev distance: 2 
Hamming distance: 1 
Levenshtein distance: 1 
Jaccard similarity: 0.6 
Sørensen-Dice index: 0.75
Haversine distance: 5587.00681965736
Mahalanobis distance: [[1.41421356]]
Pearson correlation: 1.0
Squared Euclidean distance: 8.000000000000002
Jensen-Shannon divergence: 0.6569041853099059
Chi-Square distance: 0.01923076923076923
Spearman correlation: 0.9999999999999999
Canberra distance: 0.8333333333333333

Найдите код и сводку в формате Pdf в моем репозитории.

Изображение предоставлено: Махмуд Хармуш

👏 Не забудьте поставить лайк этой статье и поделиться ею со своей сетью, чтобы поддержать мою работу! Не стесняйтесь подписываться на мой профиль на Medium, чтобы получать больше информации о машинном обучении и науке о данных. Спасибо за такую ​​поддержку! 🚀