Report abuse

Creating the basic Critics Hash


			
lisa_rose = {'Lady in the Water' => 2.5, 'Snakes on a Plane' => 3.5, 'Just My Luck' => 3.0, 
             'Superman Returns' => 3.5, 'You, Me and Dupree' => 2.5, 'The Night Listener' => 3.0}

gene_seymour = {'Lady in the Water' => 3.0, 'Snakes on a Plane' => 3.5, 'Just My Luck' => 1.5, 
                'Superman Returns' => 5.0, 'The Night Listener' => 3.0, 'You, Me and Dupree' => 3.5}

michael_phillips = {'Lady in the Water' => 2.5, 'Snakes on a Plane' => 3.0, 'Superman Returns' => 3.5,
                    'The Night Listener' => 4.0}

claudia_puig = {'Snakes on a Plane' => 3.5, 'Just My Luck' => 3.0, 'The Night Listener' => 4.5,
                'Superman Returns' => 4.0, 'You, Me and Dupree' => 2.5}

mick_lasalle = {'Lady in the Water' => 3.0, 'Snakes on a Plane' => 4.0, 'Just My Luck' => 2.0,
                'Superman Returns' => 3.0, 'The Night Listener' => 3.0, 'You, Me and Dupree' => 2.0}

jack_matthews = {'Lady in the Water' => 3.0, 'Snakes on a Plane' => 4.0, 'The Night Listener' => 3.0,
                 'Superman Returns' => 5.0, 'You, Me and Dupree' => 3.5}

toby = {'Snakes on a Plane' => 4.5, 'You, Me and Dupree' => 1.0, 'Superman Returns' => 4.0}

critics = {'Lisa Rose' => lisa_rose,
           'Gene Seymour' => gene_seymour,
           'Michael Phillips' => michael_phillips,
           'Claudia Puig' => claudia_puig,
           'Mick LaSalle' => mick_lasalle,
           'Jack Matthews' => jack_matthews,
           'Toby' => toby}

Euclidean Distance Score


			
def sim_distance(prefs, person1, person2)
  si = {}
  prefs[person1].each do |k,v|
    si[k] = 1 if prefs[person2].has_key?(k)      
  end

  return 0 if si.size == 0

  sum = 0
  si.each_key do |k|
    sum += ((prefs[person1][k] - prefs[person2][k]) ** 2)
  end

  1 / (1 + Math.sqrt(sum))
end

Pearson Correlation Score


			
def sim_pearson(prefs, person1, person2)
  si = {}
  prefs[person1].each do |k,v|
    si[k] = 1 if prefs[person2].has_key?(k)
  end

  n = si.size
  return 0 if n == 0

  sum1 = 0
  sum2 = 0
  sum1Sq = 0
  sum2Sq = 0  
  pSum = 0
  si.each_key do |k|
    p1 = prefs[person1][k]
    p2 = prefs[person2][k]
    sum1 += p1
    sum2 += p2
    sum1Sq += p1 ** 2
    sum2Sq += p2 ** 2
    pSum += p1 * p2
  end

  num = pSum - (sum1 * sum2 / n)
  den = Math.sqrt( (sum1Sq - (sum1 ** 2) / n) * (sum2Sq - (sum2 ** 2) / n))
  return 0 if den == 0

  r = num / den

end                      

puts sim_distance(critics, 'Lisa Rose', 'Gene Seymour')                                                                                    
puts sim_distance(critics, 'Michael Phillips', 'Jack Matthews')
puts sim_pearson(critics, 'Lisa Rose', 'Gene Seymour')