## 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')