Module: Ai4r::Data::Proximity

Defined in:
lib/ai4r/data/proximity.rb

Overview

This module provides classical distance functions

Class Method Summary collapse

Class Method Details

.cosine_distance(vec_a, vec_b) ⇒ Object

Cosine similarity is a measure of similarity between two vectors of an inner product space that measures the cosine of the angle between them (en.wikipedia.org/wiki/Cosine_similarity).

Parameters a and b are vectors with continuous attributes.

D = sum(a * b) / sqrt(sum(a**2)) * sqrt(sum(b**2))



101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/ai4r/data/proximity.rb', line 101

def cosine_distance(vec_a, vec_b)
  dot_product = 0.0
  norm_a = 0.0
  norm_b = 0.0

  vec_a.each_index do |i|
    dot_product += vec_a[i] * vec_b[i]
    norm_a += vec_a[i]**2
    norm_b += vec_b[i]**2
  end

  magnitude = Math.sqrt(norm_a) * Math.sqrt(norm_b)
  1 - (dot_product / magnitude)
end

.euclidean_distance(vec_a, vec_b) ⇒ Object

Euclidean distance, or L2 norm. Parameters a and b are vectors with continuous attributes. Euclidean distance tends to form hyperspherical clusters(Clustering, Xu and Wunsch, 2009). Translations and rotations do not cause a distortion in distance relation (Duda et al, 2001) If attributes are measured with different units, attributes with larger values and variance will dominate the metric.



36
37
38
# File 'lib/ai4r/data/proximity.rb', line 36

def euclidean_distance(vec_a, vec_b)
  Math.sqrt(squared_euclidean_distance(vec_a, vec_b))
end

.hamming_distance(vec_a, vec_b) ⇒ Object

The Hamming distance between two attributes vectors of equal length is the number of attributes for which the corresponding vectors are different This distance function is frequently used with binary attributes, though it can be used with other discrete attributes.



68
69
70
71
72
73
74
# File 'lib/ai4r/data/proximity.rb', line 68

def hamming_distance(vec_a, vec_b)
  count = 0
  vec_a.each_index do |i|
    count += 1 if vec_a[i] != vec_b[i]
  end
  count
end

.manhattan_distance(vec_a, vec_b) ⇒ Object

city block, Manhattan distance, or L1 norm. Parameters a and b are vectors with continuous attributes.



42
43
44
45
46
47
48
49
# File 'lib/ai4r/data/proximity.rb', line 42

def manhattan_distance(vec_a, vec_b)
  sum = 0.0
  vec_a.each_with_index do |item_a, i|
    item_b = vec_b[i]
    sum += (item_a - item_b).abs
  end
  sum
end

.simple_matching_distance(vec_a, vec_b) ⇒ Object

The “Simple matching” distance between two attribute sets is given by the number of values present on both vectors. If sets a and b have lengths da and db then:

S = 2/(da + db) * Number of values present on both sets
D = 1.0/S - 1

Some considerations:

  • a and b must not include repeated items

  • all attributes are treated equally

  • all attributes are treated equally



87
88
89
90
91
92
# File 'lib/ai4r/data/proximity.rb', line 87

def simple_matching_distance(vec_a, vec_b)
  similarity = 0.0
  vec_a.each { |item| similarity += 2 if vec_b.include?(item) }
  similarity /= (vec_a.length + vec_b.length)
  (1.0 / similarity) - 1
end

.squared_euclidean_distance(vec_a, vec_b) ⇒ Object

This is a faster computational replacement for eclidean distance. Parameters a and b are vectors with continuous attributes.



18
19
20
21
22
23
24
25
# File 'lib/ai4r/data/proximity.rb', line 18

def squared_euclidean_distance(vec_a, vec_b)
  sum = 0.0
  vec_a.each_with_index do |item_a, i|
    item_b = vec_b[i]
    sum += (item_a - item_b)**2
  end
  sum
end

.sup_distance(vec_a, vec_b) ⇒ Object

Sup distance, or L-intinity norm Parameters a and b are vectors with continuous attributes.



53
54
55
56
57
58
59
60
61
# File 'lib/ai4r/data/proximity.rb', line 53

def sup_distance(vec_a, vec_b)
  distance = 0.0
  vec_a.each_with_index do |item_a, i|
    item_b = vec_b[i]
    diff = (item_a - item_b).abs
    distance = diff if diff > distance
  end
  distance
end