programming-examples/ruby/Algorithms/measures.rb
2019-11-15 12:59:38 +01:00

43 lines
809 B
Ruby

class AbstractMeasure
def initialize(attributes)
@attributes = attributes
end
def distance(point1, point2)
raise "You should probably override this method!"
end
end
class EuclideanDistance < AbstractMeasure
def distance(p1,p2)
sum_of_squares = 0
p1.each_with_index do |p1_coord,index|
if (@attributes.include?(index))
sum_of_squares += (p1_coord - p2[index]) ** 2
end
end
Math.sqrt( sum_of_squares )
end
end
class JensenShannonDistance < AbstractMeasure
def distance(p1, p2)
m = []
p1.each_index {|i| m[i] = (p1[i]+p2[i]) / 2 }
return ( 0.5*kl(p1, m) + 0.5*kl(p2, m) )
end
def kl(p1, p2)
sum = 0.0
p1.each_index do |i|
if (@attributes.include?(i))
if (p1[i] > 0)
sum += p1[i] * Math.log( p1[i] / p2[i] )
end
end
end
return sum
end
end