Module: ActiveRecordVector::Distance

Defined in:
lib/active_record_vector/distance.rb

Overview

Vector distance and similarity calculations.

Class Method Summary collapse

Class Method Details

.cosine_similarity(vec_a, vec_b) ⇒ Object

Cosine similarity between two float arrays (returns value between -1.0 and 1.0)



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/active_record_vector/distance.rb', line 8

def cosine_similarity(vec_a, vec_b)
  return 0.0 if vec_a.nil? || vec_b.nil? || vec_a.empty? || vec_b.empty?
  return 0.0 unless vec_a.length == vec_b.length

  dot = 0.0
  norm_a = 0.0
  norm_b = 0.0

  vec_a.each_with_index do |val, idx|
    b_val = vec_b[idx]
    dot += val * b_val
    norm_a += val * val
    norm_b += b_val * b_val
  end

  denom = Math.sqrt(norm_a) * Math.sqrt(norm_b)
  return 0.0 if denom.zero?

  dot / denom
end

.euclidean_distance(vec_a, vec_b) ⇒ Object

Euclidean distance (L2 norm) between two float arrays



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/active_record_vector/distance.rb', line 30

def euclidean_distance(vec_a, vec_b)
  return Float::INFINITY if vec_a.nil? || vec_b.nil? || vec_a.empty? || vec_b.empty?
  return Float::INFINITY unless vec_a.length == vec_b.length

  sum = 0.0
  vec_a.each_with_index do |val, idx|
    diff = val - vec_b[idx]
    sum += diff * diff
  end

  Math.sqrt(sum)
end

.inner_product(vec_a, vec_b) ⇒ Object

Dot product (inner product) between two float arrays



44
45
46
47
48
49
50
51
52
53
# File 'lib/active_record_vector/distance.rb', line 44

def inner_product(vec_a, vec_b)
  return 0.0 if vec_a.nil? || vec_b.nil? || vec_a.empty? || vec_b.empty?
  return 0.0 unless vec_a.length == vec_b.length

  sum = 0.0
  vec_a.each_with_index do |val, idx|
    sum += val * vec_b[idx]
  end
  sum
end