Skip to content

Instantly share code, notes, and snippets.

@ferblape
Created April 8, 2010 06:46
Show Gist options
  • Select an option

  • Save ferblape/359847 to your computer and use it in GitHub Desktop.

Select an option

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

alvarobp commented Apr 8, 2010

Copy link
Copy Markdown

Go Blatson Go!

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