mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-01-18 08:17:01 +00:00
Added the Minkowski distance function (#10143)
* Added the Minkowski distance function * Made error handling more precise * Added note about floating point errors and corresponding doctest
This commit is contained in:
parent
53638fcec4
commit
b9a797f3d4
45
maths/minkowski_distance.py
Normal file
45
maths/minkowski_distance.py
Normal file
|
@ -0,0 +1,45 @@
|
|||
def minkowski_distance(
|
||||
point_a: list[float],
|
||||
point_b: list[float],
|
||||
order: int,
|
||||
) -> float:
|
||||
"""
|
||||
This function calculates the Minkowski distance for a given order between
|
||||
two n-dimensional points represented as lists. For the case of order = 1,
|
||||
the Minkowski distance degenerates to the Manhattan distance. For
|
||||
order = 2, the usual Euclidean distance is obtained.
|
||||
|
||||
https://en.wikipedia.org/wiki/Minkowski_distance
|
||||
|
||||
Note: due to floating point calculation errors the output of this
|
||||
function may be inaccurate.
|
||||
|
||||
>>> minkowski_distance([1.0, 1.0], [2.0, 2.0], 1)
|
||||
2.0
|
||||
>>> minkowski_distance([1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], 2)
|
||||
8.0
|
||||
>>> import numpy as np
|
||||
>>> np.isclose(5.0, minkowski_distance([5.0], [0.0], 3))
|
||||
True
|
||||
>>> minkowski_distance([1.0], [2.0], -1)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValueError: The order must be greater than or equal to 1.
|
||||
>>> minkowski_distance([1.0], [1.0, 2.0], 1)
|
||||
Traceback (most recent call last):
|
||||
...
|
||||
ValueError: Both points must have the same dimension.
|
||||
"""
|
||||
if order < 1:
|
||||
raise ValueError("The order must be greater than or equal to 1.")
|
||||
|
||||
if len(point_a) != len(point_b):
|
||||
raise ValueError("Both points must have the same dimension.")
|
||||
|
||||
return sum(abs(a - b) ** order for a, b in zip(point_a, point_b)) ** (1 / order)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
Loading…
Reference in New Issue
Block a user