# Copyright (c) 2022-2023 Jakub Więckowski
import numpy as np
__all__ = [
'euclidean_distance',
'grzegorzewski_distance',
'hamming_distance',
'hausdorf_euclidean_distance',
'luo_distance',
'normalized_euclidean_distance',
'normalized_hamming_distance',
'wang_xin_distance_1',
'wang_xin_distance_2',
'yang_chiclana_distance'
]
[docs]
def euclidean_distance(a, b):
"""
Calculates the distance between two Intuitionistic Fuzzy Sets (u, v) using Euclidean distance
Parameters
----------
a : ndarray
Intuitionistic Fuzzy Sets (u, v)
b : ndarray
Intuitionistic Fuzzy Sets (u, v)
Returns
-------
float
Crisp value representing distance
"""
if len(a) == 2 or len(b) == 2:
ap = 1 - a[0] - a[1]
bp = 1 - b[0] - b[1]
else:
ap, bp = a[2], b[2]
return np.sqrt(((a[0] - b[0])**2 + (a[1] - b[1])**2 + (ap - bp)**2) / 2)
[docs]
def grzegorzewski_distance(a, b):
"""
Calculates the distance between two Intuitionistic Fuzzy Sets (u, v) using Grzegorzewski distance
Parameters
----------
a : ndarray
Intuitionistic Fuzzy Sets (u, v)
b : ndarray
Intuitionistic Fuzzy Sets (u, v)
Returns
-------
float
Crisp value representing distance
"""
return np.max([np.abs(a[0] - b[0]), np.abs(a[1] - b[1])])
[docs]
def hamming_distance(a, b):
"""
Calculates the distance between two Intuitionistic Fuzzy Sets (u, v) using Hamming distance
Parameters
----------
a : ndarray
Intuitionistic Fuzzy Sets (u, v)
b : ndarray
Intuitionistic Fuzzy Sets (u, v)
Returns
-------
float
Crisp value representing distance
"""
if len(a) == 2 or len(b) == 2:
ap = 1 - a[0] - a[1]
bp = 1 - b[0] - b[1]
else:
ap, bp = a[2], b[2]
return (np.abs(a[0] - b[0]) + np.abs(a[1] - b[1]) + np.abs(ap - bp)) / 2
[docs]
def hausdorf_euclidean_distance(a, b):
"""
Calculates the distance between two Intuitionistic Fuzzy Sets (u, v) using Hausdorf measure-based Euclidean distance
Parameters
----------
a : ndarray
Intuitionistic Fuzzy Sets (u, v)
b : ndarray
Intuitionistic Fuzzy Sets (u, v)
Returns
-------
float
Crisp value representing distance
"""
return np.max([(a[0] - b[0])**2, (a[1] - b[1])**2])
[docs]
def luo_distance(a, b):
"""
Calculates the distance between two Intuitionistic Fuzzy Sets (u, v) using Luo distance
Parameters
----------
a : ndarray
Intuitionistic Fuzzy Sets (u, v)
b : ndarray
Intuitionistic Fuzzy Sets (u, v)
Returns
-------
float
Crisp value representing distance
"""
if len(a) == 2 or len(b) == 2:
ap = 1 - a[0] - a[1]
bp = 1 - b[0] - b[1]
else:
ap, bp = a[2], b[2]
l1 = (np.abs(a[0] - b[0]) + np.abs(a[1] - b[1]) + np.abs((a[0] + 1 - a[1]) - (b[0] + 1 - b[1]))) / 2
l2 = (ap - bp) / 2
l3 = np.max([np.abs(a[0] - b[0]), np.abs(a[1] - b[1]), np.abs(ap - bp)/2])
return 1/6 * (l1 + l2 + l3)
[docs]
def normalized_euclidean_distance(a, b):
"""
Calculates the distance between two Intuitionistic Fuzzy Sets (u, v) using normalized Euclidean distance
Parameters
----------
a : ndarray
Intuitionistic Fuzzy Sets (u, v)
b : ndarray
Intuitionistic Fuzzy Sets (u, v)
Returns
-------
float
Crisp value representing distance
"""
if len(a) == 2 or len(b) == 2:
ap = 1 - a[0] - a[1]
bp = 1 - b[0] - b[1]
else:
ap, bp = a[2], b[2]
return ((a[0] - b[0])**2 + (a[1] - b[1])**2 + (ap - bp)**2)
[docs]
def normalized_hamming_distance(a, b):
"""
Calculates the distance between two Intuitionistic Fuzzy Sets (u, v) using normalized Hamming distance
Parameters
----------
a : ndarray
Intuitionistic Fuzzy Sets (u, v)
b : ndarray
Intuitionistic Fuzzy Sets (u, v)
Returns
-------
float
Crisp value representing distance
"""
if len(a) == 2 or len(b) == 2:
ap = 1 - a[0] - a[1]
bp = 1 - b[0] - b[1]
else:
ap, bp = a[2], b[2]
return (np.abs(a[0] - b[0]) + np.abs(a[1] - b[1]) + np.abs(ap - bp))
[docs]
def wang_xin_distance_1(a, b):
"""
Calculates the distance between two Intuitionistic Fuzzy Sets (u, v) using Wang Xin distance 1
Parameters
----------
a : ndarray
Intuitionistic Fuzzy Sets (u, v)
b : ndarray
Intuitionistic Fuzzy Sets (u, v)
Returns
-------
float
Crisp value representing distance
"""
return (np.abs(a[0] - b[0]) + np.abs(a[1] - b[1])) / 4 + np.max([np.abs(a[0] - b[0]), np.abs(a[1] - b[1])]) / 2
[docs]
def wang_xin_distance_2(a, b):
"""
Calculates the distance between two Intuitionistic Fuzzy Sets (u, v) using Wang Xin distance 2
Parameters
----------
a : ndarray
Intuitionistic Fuzzy Sets (u, v)
b : ndarray
Intuitionistic Fuzzy Sets (u, v)
Returns
-------
float
Crisp value representing distance
"""
return (np.abs(a[0] - b[0])/2 + np.abs(a[1] - b[1])/2)
[docs]
def yang_chiclana_distance(a, b):
"""
Calculates the distance between two Intuitionistic Fuzzy Sets (u, v) using Yang & Chiclana distance
Parameters
----------
a : ndarray
Intuitionistic Fuzzy Sets (u, v)
b : ndarray
Intuitionistic Fuzzy Sets (u, v)
Returns
-------
float
Crisp value representing distance
"""
if len(a) == 2 or len(b) == 2:
ap = 1 - a[0] - a[1]
bp = 1 - b[0] - b[1]
else:
ap, bp = a[2], b[2]
return np.max([np.abs(a[0] - b[0]), np.abs(a[1] - b[1]) * np.abs(ap - bp)])