Module: ActiveRecordVector::Distance
- Defined in:
- lib/active_record_vector/distance.rb
Overview
Vector distance and similarity calculations.
Class Method Summary collapse
-
.cosine_similarity(vec_a, vec_b) ⇒ Object
Cosine similarity between two float arrays (returns value between -1.0 and 1.0).
-
.euclidean_distance(vec_a, vec_b) ⇒ Object
Euclidean distance (L2 norm) between two float arrays.
-
.inner_product(vec_a, vec_b) ⇒ Object
Dot product (inner product) between two float arrays.
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 |