scipy.spatial.distance.

cdist#

scipy.spatial.distance.cdist(XA, XB, метрика='euclidean', *, выход=None, **kwargs)[источник]#

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

См. Примечания для общих соглашений о вызовах.

Параметры:
XAarray_like

An \(m_A\) by \(n\) массив из \(m_A\) исходные наблюдения в \(n\)-мерное пространство. Входные данные преобразуются в тип float.

XBarray_like

An \(m_B\) by \(n\) массив из \(m_B\) исходные наблюдения в \(n\)-мерное пространство. Входные данные преобразуются в тип float.

метрикаstr или callable, опционально

Метрика расстояния для использования. Если строка, функция расстояния может быть 'braycurtis', 'canberra', 'chebyshev', 'cityblock', 'correlation', 'cosine', 'dice', 'euclidean', 'hamming', 'jaccard', 'jensenshannon', 'kulczynski1', 'mahalanobis', 'matching', 'minkowski', 'rogerstanimoto', 'russellrao', 'seuclidean', 'sokalmichener', 'sokalsneath', 'sqeuclidean', 'yule'.

**kwargsdict, optional

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

Некоторые возможные аргументы:

p : скаляр p-норма для применения Минковского, взвешенная и невзвешенная. По умолчанию: 2.

w : array_like Вектор весов для метрик, поддерживающих веса (например, Минковского).

V : array_like Вектор дисперсий для стандартизированного евклидова расстояния. По умолчанию: var(vstack([XA, XB]), axis=0, ddof=1)

VI : array_like Обратная матрица ковариации для расстояния Махаланобиса. По умолчанию: inv(cov(vstack([XA, XB].T))).T

out : ndarray Выходной массив Если не None, матрица расстояний Y сохраняется в этом массиве.

Возвращает:
Yndarray

A \(m_A\) by \(m_B\) возвращается матрица расстояний. Для каждого \(i\) и \(j\), метрика dist(u=XA[i], v=XB[j]) вычисляется и сохраняется в \(ij\) элемент.

Вызывает:
ValueError

Исключение выбрасывается, если XA и XB не имеют одинакового количества столбцов.

Примечания

Ниже приведены распространённые соглашения о вызовах:

  1. Y = cdist(XA, XB, 'euclidean')

    Вычисляет расстояние между \(m\) точек с использованием евклидова расстояния (2-норма) в качестве метрики расстояния между точками. Точки расположены как \(m\) \(n\)-мерные векторы-строки в матрице X.

  2. Y = cdist(XA, XB, 'minkowski', p=2.)

    Вычисляет расстояния с использованием расстояния Минковского \(\|u-v\|_p\) (\(p\)-norm) где \(p > 0\) (обратите внимание, что это только квазиметрика, если \(0 < p < 1\)).

  3. Y = cdist(XA, XB, 'cityblock')

    Вычисляет городское или манхэттенское расстояние между точками.

  4. Y = cdist(XA, XB, 'seuclidean', V=None)

    Вычисляет стандартизированное евклидово расстояние. Стандартизированное евклидово расстояние между двумя n-векторами u и v является

    \[\sqrt{\sum {(u_i-v_i)^2 / V[x_i]}}.\]

    V - вектор дисперсии; V[i] - дисперсия, вычисленная по всем i-м компонентам точек. Если не передано, вычисляется автоматически.

  5. Y = cdist(XA, XB, 'sqeuclidean')

    Вычисляет квадрат евклидова расстояния \(\|u-v\|_2^2\) между векторами.

  6. Y = cdist(XA, XB, 'cosine')

    Вычисляет косинусное расстояние между векторами u и v,

    \[1 - \frac{u \cdot v} {{\|u\|}_2 {\|v\|}_2}\]

    где \(\|*\|_2\) является 2-нормой своего аргумента *, и \(u \cdot v\) является скалярным произведением \(u\) и \(v\).

  7. Y = cdist(XA, XB, 'correlation')

    Вычисляет корреляционное расстояние между векторами u и v. Это

    \[1 - \frac{(u - \bar{u}) \cdot (v - \bar{v})} {{\|(u - \bar{u})\|}_2 {\|(v - \bar{v})\|}_2}\]

    где \(\bar{v}\) является средним значением элементов вектора v, и \(x \cdot y\) является скалярным произведением \(x\) и \(y\).

  8. Y = cdist(XA, XB, 'hamming')

    Вычисляет нормализованное расстояние Хэмминга или долю элементов вектора между двумя n-векторами u и v которые не согласуются. Для экономии памяти матрица X может быть типа boolean.

  9. Y = cdist(XA, XB, 'jaccard')

    Вычисляет расстояние Жаккара между точками. Для двух векторов, u и v, расстояние Жаккара — это доля тех элементов u[i] и v[i] которые расходятся там, где хотя бы один из них ненулевой.

  10. Y = cdist(XA, XB, 'jensenshannon')

    Вычисляет расстояние Йенсена-Шеннона между двумя вероятностными массивами. Даны два вероятностных вектора, \(p\) и \(q\), расстояние Йенсена-Шеннона равно

    \[\sqrt{\frac{D(p \parallel m) + D(q \parallel m)}{2}}\]

    где \(m\) является поточечным средним \(p\) и \(q\) и \(D\) является дивергенцией Кульбака-Лейблера.

  11. Y = cdist(XA, XB, 'chebyshev')

    Вычисляет расстояние Чебышёва между точками. Расстояние Чебышёва между двумя n-векторами u и v является максимальным расстоянием нормы-1 между их соответствующими элементами. Более точно, расстояние задается как

    \[d(u,v) = \max_i {|u_i-v_i|}.\]
  12. Y = cdist(XA, XB, 'canberra')

    Вычисляет расстояние Канберры между точками. Расстояние Канберры между двумя точками u и v является

    \[d(u,v) = \sum_i \frac{|u_i-v_i|} {|u_i|+|v_i|}.\]
  13. Y = cdist(XA, XB, 'braycurtis')

    Вычисляет расстояние Брея-Кёртиса между точками. Расстояние Брея-Кёртиса между двумя точками u и v является

    \[d(u,v) = \frac{\sum_i (|u_i-v_i|)} {\sum_i (|u_i+v_i|)}\]
  14. Y = cdist(XA, XB, 'mahalanobis', VI=None)

    Вычисляет расстояние Махаланобиса между точками. Расстояние Махаланобиса между двумя точками u и v является \(\sqrt{(u-v)(1/V)(u-v)^T}\) где \((1/V)\) (the VI переменная) является обратной ковариацией. Если VI не является None, VI будет использоваться как обратная ковариационная матрица.

  15. Y = cdist(XA, XB, 'yule')

    Вычисляет расстояние Юла между булевыми векторами. (см. yule документация функции)

  16. Y = cdist(XA, XB, 'matching')

    Синоним для ‘hamming’.

  17. Y = cdist(XA, XB, 'dice')

    Вычисляет расстояние Дайса между булевыми векторами. (см. dice документация функции)

  18. Y = cdist(XA, XB, 'kulczynski1')

    Вычисляет расстояние Кульчинского между булевыми векторами. (см. kulczynski1 документация функции)

    Устарело с версии 1.15.0: Эта метрика устарела и будет удалена в SciPy 1.17.0. Замените использование cdist(XA, XB, 'kulczynski1') с 1 / cdist(XA, XB, 'jaccard') - 1.

  19. Y = cdist(XA, XB, 'rogerstanimoto')

    Вычисляет расстояние Роджерса-Танимото между булевыми векторами. (см. rogerstanimoto документация функции)

  20. Y = cdist(XA, XB, 'russellrao')

    Вычисляет расстояние Рассела-Рао между булевыми векторами. (см. russellrao документация функции)

  21. Y = cdist(XA, XB, 'sokalmichener')

    Вычисляет расстояние Сокала-Миченера между булевыми векторами. (см. sokalmichener документация функции)

    Устарело с версии 1.15.0: Эта метрика устарела и будет удалена в SciPy 1.17.0. Замените использование cdist(XA, XB, 'sokalmichener') с cdist(XA, XB, 'rogerstanimoto').

  22. Y = cdist(XA, XB, 'sokalsneath')

    Вычисляет расстояние Сокала-Снита между векторами. (см. sokalsneath документация функции)

  23. Y = cdist(XA, XB, f)

    Вычисляет расстояние между всеми парами векторов в X с использованием предоставленной пользователем 2-арной функции f. Например, Евклидово расстояние между векторами может быть вычислено следующим образом:

    dm = cdist(XA, XB, lambda u, v: np.sqrt(((u-v)**2).sum()))
    

    Обратите внимание, что следует избегать передачи ссылки на одну из функций расстояния, определенных в этой библиотеке. Например,:

    dm = cdist(XA, XB, sokalsneath)
    

    вычислит попарные расстояния между векторами в X, используя функцию Python sokalsneath. Это приведет к вызову sokalsneath \({n \choose 2}\) раз, что неэффективно. Вместо этого оптимизированная версия на C более эффективна, и мы вызываем её, используя следующий синтаксис:

    dm = cdist(XA, XB, 'sokalsneath')
    

Примеры

Найти евклидовы расстояния между четырьмя 2-D координатами:

>>> from scipy.spatial import distance
>>> import numpy as np
>>> coords = [(35.0456, -85.2672),
...           (35.1174, -89.9711),
...           (35.9728, -83.9422),
...           (36.1667, -86.7833)]
>>> distance.cdist(coords, coords, 'euclidean')
array([[ 0.    ,  4.7044,  1.6172,  1.8856],
       [ 4.7044,  0.    ,  6.0893,  3.3561],
       [ 1.6172,  6.0893,  0.    ,  2.8477],
       [ 1.8856,  3.3561,  2.8477,  0.    ]])

Найдите манхэттенское расстояние от 3-D точки до углов единичного куба:

>>> a = np.array([[0, 0, 0],
...               [0, 0, 1],
...               [0, 1, 0],
...               [0, 1, 1],
...               [1, 0, 0],
...               [1, 0, 1],
...               [1, 1, 0],
...               [1, 1, 1]])
>>> b = np.array([[ 0.1,  0.2,  0.4]])
>>> distance.cdist(a, b, 'cityblock')
array([[ 0.7],
       [ 0.9],
       [ 1.3],
       [ 1.5],
       [ 1.5],
       [ 1.7],
       [ 2.1],
       [ 2.3]])