-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdistancies.py
49 lines (39 loc) · 2.05 KB
/
distancies.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
41
42
43
44
45
46
47
48
49
# -*- coding: utf-8 -*-
#+--------------------------------------------------------------------------+#
# Importem mòduls #
#+--------------------------------------------------------------------------+#
from abc import ABC, abstractmethod
import numpy as np
np.seterr(divide='ignore', invalid='ignore')
from math import sqrt
#+--------------------------------------------------------------------------+#
# Definim les classes #
#+--------------------------------------------------------------------------+#
class Distancia(ABC):
@abstractmethod
def calcula_distancia(self, arxiu_query, arxiu_2):
raise NotImplementedError
class Intersection(Distancia):
def calcula_distancia(self, arxiu_query, arxiu_2, agrupa = None):
if agrupa == None:
dist = np.sum(np.minimum(arxiu_query.representation, arxiu_2.representation))
den = min(np.sum(arxiu_query.representation), np.sum(arxiu_2.representation))
if den != 0: return 1 - (dist / den)
else: return 1
else:
dist = np.sum(np.minimum(arxiu_query.representation, arxiu_2))
den = min(np.sum(arxiu_query.representation), np.sum(arxiu_2))
if den != 0: return 1 - (dist / den)
else: return 1
class Cosinus(Distancia):
def calcula_distancia(self, arxiu_query, arxiu_2, agrupa = None):
if agrupa == None:
dist = np.sum(arxiu_query.representation * arxiu_2.representation,dtype=np.uint64)
den1 = sqrt(np.sum(arxiu_query.representation**2,dtype=np.uint64))
den2 = sqrt(np.sum(arxiu_2.representation**2,dtype=np.uint64))
return 1 - ((dist)/(den1*den2))
else:
dist = np.sum(arxiu_query.representation * arxiu_2, dtype=np.uint64)
den1 = sqrt(np.sum(arxiu_query.representation**2, dtype=np.uint64))
den2 = sqrt(np.sum(arxiu_2**2,dtype=np.uint64))
return 1 - ((dist)/(den1*den2))