Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.32 KB | None | 0 0
  1. from math import*
  2. from decimal import Decimal
  3. from numpy import linalg as LA
  4. import numpy as np
  5. import cv2
  6.  
  7. class Similarity():
  8.  
  9. """ Five similarity measures function """
  10.  
  11. def euclidean_distance(self,x,y):
  12.  
  13. """ return euclidean distance between two lists """
  14.  
  15. return sqrt(sum(pow(a-b,2) for a, b in zip(x, y)))
  16.  
  17. def manhattan_distance(self,x,y):
  18.  
  19. """ return manhattan distance between two lists """
  20.  
  21. return sum(abs(a-b) for a,b in zip(x,y))
  22.  
  23. def minkowski_distance(self,x,y,p_value):
  24.  
  25. """ return minkowski distance between two lists """
  26.  
  27. return self.nth_root(sum(pow(abs(a-b),p_value) for a,b in zip(x, y)),
  28. p_value)
  29.  
  30. def nth_root(self,value, n_root):
  31.  
  32. """ returns the n_root of an value """
  33.  
  34. root_value = 1/float(n_root)
  35. return round (Decimal(value) ** Decimal(root_value),3)
  36.  
  37. def cosine_similarity(self,x,y):
  38.  
  39. """ return cosine similarity between two lists """
  40.  
  41. numerator = sum(a*b for a,b in zip(x,y))
  42. denominator = self.square_rooted(x)*self.square_rooted(y)
  43. return round(numerator/float(denominator),3)
  44.  
  45. def square_rooted(self,x):
  46.  
  47. """ return 3 rounded square rooted value """
  48.  
  49. return round(sqrt(sum([a*a for a in x])),3)
  50.  
  51. def jaccard_similarity(self,x,y):
  52. """ returns the jaccard similarity between two lists """
  53.  
  54. intersection_cardinality = len(set.intersection(*[set(x), set(y)]))
  55. union_cardinality = len(set.union(*[set(x), set(y)]))
  56. return intersection_cardinality/float(union_cardinality)
  57.  
  58. def feature_matching_sim(matches):
  59. similar_regions = [i for i in matches if i.distance <= 1.5]
  60. return (len(similar_regions)/ len(matches))
  61.  
  62. def normalize(arr):
  63. rng = arr.max()-arr.min()
  64. amin = arr.min()
  65. return (arr-amin)*255/rng
  66.  
  67. def distances_p1_p2(p1, p2, vis=False):
  68. suppress_warnings_and_error_messages = True
  69. # the main function to create Similarity class instance and get used to it
  70. measures = Similarity()
  71.  
  72. p1 = np.array(p1).flatten()
  73. p2 = np.array(p2).flatten()
  74. try:
  75. max_euclidian = measures.euclidean_distance(np.ones_like(p1) * 255, np.zeros_like(p2))
  76. max_manhattan = measures.manhattan_distance(np.ones_like(p1) * 255, np.zeros_like(p2))
  77. max_minkowski = measures.minkowski_distance(np.ones_like(p1) * 255, np.zeros_like(p2), 3)
  78.  
  79. # distance ranging from 0 to 1
  80. euclidian = measures.euclidean_distance(p1, p2) / max_euclidian
  81. manhattan = measures.manhattan_distance(p1, p2) / max_manhattan
  82. minkowski = float(measures.minkowski_distance(p1, p2,3)) / float(max_minkowski)
  83. cosine = min(measures.cosine_similarity(p1, p2), 1.)
  84. jacard = min(measures.jaccard_similarity(p1, p2), 1.)
  85.  
  86. except Exception as e:
  87. import traceback
  88. if not suppress_warnings_and_error_messages:
  89. traceback.print_exc()
  90.  
  91. if vis:
  92. print("Euclidiean distance: {}".format(euclidian))
  93. print("Manhattan distance: {}".format(manhattan))
  94. print("Minkowski distance: {}".format(minkowski))
  95. print("Cosine similarity: {}".format(cosine))
  96. print("Jacard similarity: {}".format(jacard))
  97.  
  98. return euclidian, manhattan, minkowski, cosine, jacard
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement