集合知プログラミング

集合知プログラミング

集合知プログラミング


売り切れ必死かと思いきや,運良く梅田のジュンク堂に2冊残っており無事入手できました.
さっそく読み始め,2章のユークリッド距離によるスコアをRubyで書き直してみました.

require 'enumerator'
require 'yaml'
require 'pp'

class Array
  def sum
    self.inject(0) {|total, i| total + i}
  end
end

def sim_distance(prefs, person1, person2)
  both = {}  
  prefs[person1].each_key do |key|
    both[key] = 1 if prefs[person2].key? key      
  end
  return 0 if both.size == 0 
  
  sum_of_squares = both.enum_for(:each_key).map {|key|
    (prefs[person1][key] - prefs[person2][key])**2 
  }.sum
  
  return 1/(1 + sum_of_squares)
end

if __FILE__ == $0
  data = File.open("critics.yaml") {|f|
    f.read
  }

  critics = YAML.load(data)
  p sim_distance(critics, "Lisa Rose", "Gene Seymour")
  #=> 0.148148148148148
end

読み進めるのが非常に楽しいです.