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 не имеют одинакового количества столбцов.
Примечания
Ниже приведены распространённые соглашения о вызовах:
Y = cdist(XA, XB, 'euclidean')Вычисляет расстояние между \(m\) точек с использованием евклидова расстояния (2-норма) в качестве метрики расстояния между точками. Точки расположены как \(m\) \(n\)-мерные векторы-строки в матрице X.
Y = cdist(XA, XB, 'minkowski', p=2.)Вычисляет расстояния с использованием расстояния Минковского \(\|u-v\|_p\) (\(p\)-norm) где \(p > 0\) (обратите внимание, что это только квазиметрика, если \(0 < p < 1\)).
Y = cdist(XA, XB, 'cityblock')Вычисляет городское или манхэттенское расстояние между точками.
Y = cdist(XA, XB, 'seuclidean', V=None)Вычисляет стандартизированное евклидово расстояние. Стандартизированное евклидово расстояние между двумя n-векторами
uиvявляется\[\sqrt{\sum {(u_i-v_i)^2 / V[x_i]}}.\]V - вектор дисперсии; V[i] - дисперсия, вычисленная по всем i-м компонентам точек. Если не передано, вычисляется автоматически.
Y = cdist(XA, XB, 'sqeuclidean')Вычисляет квадрат евклидова расстояния \(\|u-v\|_2^2\) между векторами.
Y = cdist(XA, XB, 'cosine')Вычисляет косинусное расстояние между векторами u и v,
\[1 - \frac{u \cdot v} {{\|u\|}_2 {\|v\|}_2}\]где \(\|*\|_2\) является 2-нормой своего аргумента
*, и \(u \cdot v\) является скалярным произведением \(u\) и \(v\).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\).
Y = cdist(XA, XB, 'hamming')Вычисляет нормализованное расстояние Хэмминга или долю элементов вектора между двумя n-векторами
uиvкоторые не согласуются. Для экономии памяти матрицаXможет быть типа boolean.Y = cdist(XA, XB, 'jaccard')Вычисляет расстояние Жаккара между точками. Для двух векторов,
uиv, расстояние Жаккара — это доля тех элементовu[i]иv[i]которые расходятся там, где хотя бы один из них ненулевой.Y = cdist(XA, XB, 'jensenshannon')Вычисляет расстояние Йенсена-Шеннона между двумя вероятностными массивами. Даны два вероятностных вектора, \(p\) и \(q\), расстояние Йенсена-Шеннона равно
\[\sqrt{\frac{D(p \parallel m) + D(q \parallel m)}{2}}\]где \(m\) является поточечным средним \(p\) и \(q\) и \(D\) является дивергенцией Кульбака-Лейблера.
Y = cdist(XA, XB, 'chebyshev')Вычисляет расстояние Чебышёва между точками. Расстояние Чебышёва между двумя n-векторами
uиvявляется максимальным расстоянием нормы-1 между их соответствующими элементами. Более точно, расстояние задается как\[d(u,v) = \max_i {|u_i-v_i|}.\]Y = cdist(XA, XB, 'canberra')Вычисляет расстояние Канберры между точками. Расстояние Канберры между двумя точками
uиvявляется\[d(u,v) = \sum_i \frac{|u_i-v_i|} {|u_i|+|v_i|}.\]Y = cdist(XA, XB, 'braycurtis')Вычисляет расстояние Брея-Кёртиса между точками. Расстояние Брея-Кёртиса между двумя точками
uиvявляется\[d(u,v) = \frac{\sum_i (|u_i-v_i|)} {\sum_i (|u_i+v_i|)}\]Y = cdist(XA, XB, 'mahalanobis', VI=None)Вычисляет расстояние Махаланобиса между точками. Расстояние Махаланобиса между двумя точками
uиvявляется \(\sqrt{(u-v)(1/V)(u-v)^T}\) где \((1/V)\) (theVIпеременная) является обратной ковариацией. ЕслиVIне является None,VIбудет использоваться как обратная ковариационная матрица.Y = cdist(XA, XB, 'yule')Вычисляет расстояние Юла между булевыми векторами. (см.
yuleдокументация функции)Y = cdist(XA, XB, 'matching')Синоним для ‘hamming’.
Y = cdist(XA, XB, 'dice')Вычисляет расстояние Дайса между булевыми векторами. (см.
diceдокументация функции)Y = cdist(XA, XB, 'kulczynski1')Вычисляет расстояние Кульчинского между булевыми векторами. (см.
kulczynski1документация функции)Устарело с версии 1.15.0: Эта метрика устарела и будет удалена в SciPy 1.17.0. Замените использование
cdist(XA, XB, 'kulczynski1')с1 / cdist(XA, XB, 'jaccard') - 1.Y = cdist(XA, XB, 'rogerstanimoto')Вычисляет расстояние Роджерса-Танимото между булевыми векторами. (см.
rogerstanimotoдокументация функции)Y = cdist(XA, XB, 'russellrao')Вычисляет расстояние Рассела-Рао между булевыми векторами. (см.
russellraoдокументация функции)Y = cdist(XA, XB, 'sokalmichener')Вычисляет расстояние Сокала-Миченера между булевыми векторами. (см.
sokalmichenerдокументация функции)Устарело с версии 1.15.0: Эта метрика устарела и будет удалена в SciPy 1.17.0. Замените использование
cdist(XA, XB, 'sokalmichener')сcdist(XA, XB, 'rogerstanimoto').Y = cdist(XA, XB, 'sokalsneath')Вычисляет расстояние Сокала-Снита между векторами. (см.
sokalsneathдокументация функции)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]])