- Расчет евклидова расстояния с помощью NumPy
- Математическая формула
- Использование встроенной системы math.dist()
- Заключение
- Calculate distance between two points in Python
- Euclidean distance between two points
- Euclidean distance in Python
- Euclidean distance using math library
- Euclidean distance using numpy library
- Euclidean distance using scipy library
- Author
Расчет евклидова расстояния с помощью NumPy
Евклидово расстояние — это фундаментальная метрика расстояния, относящаяся к системам в евклидовом пространстве.
- Евклидово пространство — это классическое геометрическое пространство, с которым вы знакомитесь на уроке математики, обычно связанное с 3 измерениями. Хотя его также можно приписать к любой неотрицательной целочисленной размерности.
- Евклидово расстояние — кратчайшая прямая между двумя точками в евклидовом пространстве.
Название происходит от Евклида, который широко известен как «отец геометрии», так как это было единственное пространство, которое люди в то время обычно задумывали. Со временем в физике и математике наблюдались различные типы пространства, такие как пространство Аффин.
- В 3-мерном евклидовом пространстве кратчайшая прямая между двумя точкамивсегдабудетпрямой линиеймежду ними.
Учитывая этот факт, евклидово расстояние не всегда является наиболее полезной метрикой для отслеживания при работе со многими размерностями, мы сосредоточимся на 2D и 3D евклидовом пространстве для расчета евклидова расстояния.
Вообще говоря, евклидова расстояние широко используется в разработке 3D-миров, а также алгоритмов машинного обучения, которые включают в себя метрики расстояния, такие как K-ближайшие соседи. Как правило, евклидово расстояние будет представлять, насколько похожи две точки данных, предполагая, что некоторая кластеризация на основе других данных уже была выполнена.
Математическая формула
Математическая формула расчета евклидова расстояния между 2 точками в 2D пространстве:
Формула легко адаптируется к 3D-пространство, а также к любому размеру:
Общая формула может быть упрощена до:
Острый глаз может заметить сходство между евклидовым расстоянием и теоремой Пифагора:
На самом деле существует связь между ними — евклидовое расстояние рассчитывается с помощью теоремы Пифагора, учитывая декартовы координаты двух точек.
Из-за этого евклидова расстояние иногда называют расстоянием Пифагора, хотя прежнее название гораздо более известно.
Примечание: Две точки являются векторами, но выход должен быть скалярным.
Мы будем использовать NumPy для расчета этого расстояния для двух точек, и один и тот же подход используется для 2D и 3D пространств:
import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() ax = fig.add_subplot(111, projection = '3d') ax.scatter(0, 0, 0) ax.scatter(3, 3, 3) plt.show()
Расчет евклидова расстояния в Python с помощью NumPy
Во-первых, нам нужно будет установить библиотеку NumPy:
Теперь давайте импортируем его и настроим две наши точки с декартовыми координатами (0, 0, 0) и (3, 3, 3):
import numpy as np # Initializing the points point_1 = np.array((0, 0, 0)) point_2 = np.array((3, 3, 3))
Вместо того, чтобы выполнять расчет вручную, мы будем использовать вспомогательные методы NumPy, чтобы сделать его еще проще!
Операции и математические функции, необходимые для расчета евклидова расстояния, довольно просты: сложение, вычитание, а также функция квадратного корня. Несколько слагаемых также можно заменить суммой:
NumPy предоставляет нам функцию np.sqrt(), представляющую функцию квадратного корня, а также функцию np.sum(), которая представляет собой сумму. При этом расчет евклидова расстояния в Python прост и интуитивно понятен:
# Get the square of the difference of the 2 vectors square = np.square(point_1 - point_2) # Get the sum of the square sum_square = np.sum(square)
Данная формула дает нам довольно простой результат:
Что равно 27. Осталось все, что получить квадратный корень из этого числа:
# The last step is to get the square root and print the Euclidean distance distance = np.sqrt(sum_square) print(distance)
В истинном питоновом духе это можно сократить до одной строки:
И вы даже можете вместо этого использовать встроенные методы pow() и sum() математического модуля Python, хотя они требуют, чтобы вы немного поработали с вводом, который удобно абстрагируется с помощью NumPy, так как функция pow() работает только со скалярами (каждый элемент в массиве индивидуально) и принимает аргумент — в какой степени вы увеличиваете число.
Этот подход, однако, интуитивно больше похож на формулу, которую мы использовали раньше:
from math import * distance = np.sqrt(sum(pow(a-b, 2) for a, b in zip(point_1, point_2))) print(distance)
np.linalg.norm()
Функция np.linalg.norm() представляет математическую норму. По сути, нормой вектора является его длина. Эта длина не обязательно должна быть евклидовым расстоянием, а может быть и другими расстояниями. Евклидово расстояние-это норма L2 вектора (иногда известная как евклидова норма), и по умолчанию функция norm() использует L2 — параметр ord имеет значение 2.
Если бы вы установили для параметра ord какое-то другое значение p, вы бы рассчитали другие p-нормы. Например, норма L1 вектора-это расстояние Манхэттена!
Имея это в виду, мы можем использовать функцию np.linalg.norm() для легкого и гораздо более чистого вычисления евклидова расстояния, чем использование других функций:
distance = np.linalg.norm(point_1-point_2) print(distance)
Это приводит к печати расстояния L2/евклида:
Нормализация L2 и нормализация L1 широко используются в машинном обучении для нормализации входных данных.
Мы также можем использовать точечное произведение для расчета евклидова расстояния. В математике точечное произведение является результатом умножения двух векторов равной длины, а результатом является единственное число — скалярное значение. Из-за возвращаемого типа его иногда также называют «скалярным продуктом». Эту операцию часто называют внутренним произведением для двух векторов.
Для расчета точечного произведения между 2 векторами вы можете использовать следующую формулу:
С помощью NumPy мы можем использовать функцию np.dot(), передавая два вектора.
Если мы вычислим точечное произведение разницы между обеими точками с той же разницей — мы получим число, которое находится в зависимости от евклидова расстояния между этими двумя векторами. Извлечение квадратного корня из этого числа дает нам расстояние, которое мы ищем:
# Take the difference between the 2 points diff = point_1 - point_2 # Perform the dot product on the point with itself to get the sum of the squares sum_square = np.dot(diff, diff) # Get the square root of the result distance = np.sqrt(sum_square) print(distance)
Конечно, вы также можете сократить это до однострочного:
distance = np.sqrt(np.dot(point_1-point_2, point_1-point_2)) print(distance)
Использование встроенной системы math.dist()
В Python есть встроенный метод в математическом модуле, который вычисляет расстояние между 2 точками в трехмерном пространстве. Однако это работает только с Python 3.8 или более поздней версии.
math.dist()принимает два параметра, которые являются двумя точками, и возвращает евклидово расстояние между этими точками.
Примечание: Обратите внимание, что две точки должны иметь одинаковые размеры (т.е. оба в 2d или 3d пространстве).
Теперь, чтобы вычислить Евклидово расстояние между этими двумя точками, мы просто заправляем их в метод thedistdist():
import math distance = math.dist(point_1, point_2) print(distance)
Заключение
Данная метрика используется во многих контекстах в интеллектуальном анализе данных, машинном обучении и ряде других областей и является одной из фундаментальных метрик расстояния.
Calculate distance between two points in Python
In this tutorial, we will look at how to calculate the distance between two points in Python with the help of some examples.
If you prefer video over text, check out the following video detailing the steps in this tutorial –
There are a number of ways to compute the distance between two points in Python. You can compute the distance directly or use methods from libraries like math , scipy , numpy , etc.
Euclidean distance between two points
We generally refer to the Euclidean distance when talking about the distance between two points. To calculate the Euclidean distance between the points (x1, y1) and (x2, y2) you can use the formula:
For example, the distance between points (2, 3) and (5, 7) is 5. Note that the above formula can be extended to n-dimensions.
Euclidean distance in Python
Now that we know how the distance between two points is computed mathematically, we can proceed to compute it in Python.
Python has a number of libraries that help you compute distances between two points, each represented by a sequence of coordinates. Before we proceed to use off-the-shelf methods, let’s directly compute the distance between points (x1, y1) and (x2, y2).
# point a x1 = 2 y1 = 3 # point b x2 = 5 y2 = 7 # distance b/w a and b distance = ((x1 - x2)**2 + (y1 - y2)**2)**0.5 # display the result print("Distance between points (<>, <>) and (<>, <>) is <>".format(x1,y1,x2,y2,distance))
Distance between points (2, 3) and (5, 7) is 5.0
You can see that we get the distance between the points (2, 3) and (5, 7) as 5. Note that the above formula works only for points in two dimensions.
Let’s now write a generalized function that can handle points with any number of dimensions.
def get_distance(p, q): """ Return euclidean distance between points p and q assuming both to have the same number of dimensions """ # sum of squared difference between coordinates s_sq_difference = 0 for p_i,q_i in zip(p,q): s_sq_difference += (p_i - q_i)**2 # take sq root of sum of squared difference distance = s_sq_difference**0.5 return distance # check the function a = (2, 3, 6) b = (5, 7, 1) # distance b/w a and b d = get_distance(a, b) # display the result print(d)
You can see that we used the function to get distance between two points with three dimensions each. We can now use this function to calculate distances between two points with any dimensions.
Note that the above function can further be improved by using vectorization to calculate the difference between the coordinates.
Euclidean distance using math library
You can use the math.dist() function to get the Euclidean distance between two points in Python. For example, let’s use it the get the distance between two 3-dimensional points each represented by a tuple.
import math # two points a = (2, 3, 6) b = (5, 7, 1) # distance b/w a and b d = math.dist(a, b) # display the result print(d)
We get the same value as above.
Euclidean distance using numpy library
The Euclidean distance is equivalent to the l2 norm of the difference between the two points which can be calculated in numpy using the numpy.linalg.norm() function.
import numpy as np # two points a = np.array((2, 3, 6)) b = np.array((5, 7, 1)) # distance b/w a and b d = np.linalg.norm(a-b) # display the result print(d)
We get the same result as above. Note that, here, we pass the difference between points a and b as a numpy array to the the np.linalg.norm() function.
Euclidean distance using scipy library
The scipy library contains a number of useful functions of scientific computation in Python. Use the distance.euclidean() function available in scipy.spatial to calculate the Euclidean distance between two points in Python.
from scipy.spatial import distance # two points a = (2, 3, 6) b = (5, 7, 1) # distance b/w a and b d = distance.euclidean(a, b) # display the result print(d)
We get the same result as above. For more on the distance function, refer to its documentation.
With this, we come to the end of this tutorial. The code examples and results presented in this tutorial have been implemented in a Jupyter Notebook with a python (version 3.8.3) kernel having numpy version 1.18.5 and pandas version 1.0.5
Subscribe to our newsletter for more informative guides and tutorials.
We do not spam and you can opt out any time.
Author
Piyush is a data professional passionate about using data to understand things better and make informed decisions. He has experience working as a Data Scientist in the consulting domain and holds an engineering degree from IIT Roorkee. His hobbies include watching cricket, reading, and working on side projects. View all posts
Data Science Parichay is an educational website offering easy-to-understand tutorials on topics in Data Science with the help of clear and fun examples.