Skip to content

Instantly share code, notes, and snippets.

@ferblape
Created April 8, 2010 06:46
Show Gist options
  • Save ferblape/359847 to your computer and use it in GitHub Desktop.
Save ferblape/359847 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'ruby-debug'
def sim_pearson(data, compare1, compare2)
puts
puts
puts "sim_pearson"
puts "==========="
# Vemos si comparten items, sino saldremos
shared_items = []
data[compare1].each_key do |item|
shared_items << item if data[compare2].has_key?(item)
end
n = shared_items.size
return 0 unless n>0
sum1 = sum2 = sum1Sq = sum2Sq = pSum = 0.0
# puts "shared_items: #{shared_items.inspect}"
shared_items.each do |item|
data1_item = data[compare1][item] || 0.0
data2_item = data[compare2][item] || 0.0
puts "item: #{item} (d1item: #{data1_item} - d2item: #{data2_item})"
sum1 += data1_item
sum2 += data2_item
sum1Sq += data1_item ** 2
sum2Sq += data2_item ** 2
pSum += data2_item * data1_item
# puts " sum1: #{sum1} - sum2: #{sum2} - sum1Sq: #{sum1Sq} - sum2Sq: #{sum2Sq} - pSum: #{pSum}"
end
num = pSum - ((sum1*sum2)/n)
den = Math.sqrt((sum1Sq - (sum1**2 )/n) * (sum2Sq - (sum2**2)/n))
puts ">> num: #{num} - den: #{den} - #{(den == 0 ? 0 : num/den)}"
return (den == 0 ? 0 : num/den)
end
def sim_blatson(data, compare1, compare2)
puts
puts
puts "sim_blatson"
puts "==========="
# Vemos si comparten items, sino saldremos
shared_items = []
data[compare1].each_key do |item|
next if !data[compare2].has_key?(item) || (data[compare1][item] == 3 && data[compare2][item] == 3)
shared_items << item
end
n = shared_items.size
return 0 unless n>0
sum1 = sum2 = sum1Sq = sum2Sq = pSum = 0.0
# puts "shared_items: #{shared_items.inspect}"
shared_items.each do |item|
data1_item = data[compare1][item] || 0.0
data2_item = data[compare2][item] || 0.0
puts "item: #{item} (d1item: #{data1_item} - d2item: #{data2_item})"
sum1 += data1_item
sum2 += data2_item
sum1Sq += data1_item ** 2
sum2Sq += data2_item ** 2
pSum += data2_item * data1_item
puts " sum1: #{sum1} - sum2: #{sum2} - sum1Sq: #{sum1Sq} - sum2Sq: #{sum2Sq} - pSum: #{pSum}"
end
num = pSum - ((sum1*sum2)/n)
den = Math.sqrt((sum1Sq - (sum1**2 )/n) * (sum2Sq - (sum2**2)/n))
puts ">> num: #{num} - den: #{den} - #{(den == 0 ? 0 : num/den)}"
return (den == 0 ? 0 : num/den)
end
data = {
'u1' => { 'a' => 5, 'b' => 3, 'c' => 1 },
'u5' => { 'a' => nil, 'b' => 3, 'c' => 1 },
'u2' => { 'a' => 1, 'b' => 3, 'c' => 1 },
'u3' => { 'a' => 2, 'b' => 3, 'c' => 1 },
'u4' => { 'a' => 3, 'b' => 3, 'c' => 1 },
'u6' => { 'a' => 4, 'b' => 3, 'c' => 1 }
}
sim_pearson(data, 'u1', 'u5')
sim_pearson(data, 'u1', 'u2')
sim_pearson(data, 'u1', 'u3')
sim_pearson(data, 'u1', 'u4')
sim_pearson(data, 'u1', 'u6')
sim_blatson(data, 'u1', 'u5')
sim_blatson(data, 'u1', 'u2')
sim_blatson(data, 'u1', 'u3')
sim_blatson(data, 'u1', 'u4')
sim_blatson(data, 'u1', 'u6')
@alvarobp
Copy link

alvarobp commented Apr 8, 2010

Go Blatson Go!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment