-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathDistance.py
40 lines (34 loc) · 1.12 KB
/
Distance.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 14:22:09 2016-10-22
@author: heshenghuan (heshenghuan@sina.com)
http://github.com/heshenghuan
"""
import math
# Manhattan distance
ManhattanDistance = (lambda a, b: sum(
abs(a.get(axis, 0.) - b.get(axis, 0.)) for axis in range(len(a))))
# Euclidean distance
EuclideanDistance = (lambda a, b: math.sqrt(
sum(abs(a.get(axis, 0.) - b.get(axis, 0.))**2 for axis in range(len(a)))))
# Chebyshev distance
ChebyshevDistance = (lambda a, b: max(
abs(a.get(axis, 0.) - b.get(axis, 0.)) for axis in range(len(a))))
def MinkowskiDistance(p=1):
"""
Minkowski distance.
Given a lambda function by value p.
"""
if p == 1:
return ManhattanDistance
elif p == 2:
return EuclideanDistance
elif p == float('INF'):
return ChebyshevDistance
elif p == float('-INF'):
return lambda a, b: min(
abs(a.get(axis, 0.) - b.get(axis, 0.)) for axis in range(len(a)))
else:
return lambda a, b: sum(abs(a.get(axis, 0.) - b.get(axis, 0.))**p
for axis in range(len(a)))**(1.0 / p)