スコアを計算するプログラムを書いた。
#! /usr/bin/env python # -*- coding: utf-8 -*- #ファイル読み込み # **注意**入力データは勧める対象のユーザによってソートしておくこと! #アルゴリズムで求めた方のデータ f_a = open("algorithm.txt") a_data = {} arr = [] array = [] first = [] last = [] key = [] for line in f_a: first = line.split("\t")[0] last = line.split("\t")[1].strip() if first in key: value.append(last) else: #新たにキーを発見した時に発動する value = [] # valueリストをクリア key.append(first) value.append(last) a_data[first] = value #評価用データ f_b = open("estimation.txt") b_data = {} arr = [] array = [] first = [] last = [] key = [] for line in f_b: first = line.split("\t")[0] last = line.split("\t")[1].strip() if first in key: value.append(last) else: #新たにキーを発見した時に発動する value = [] # valueリストをクリア key.append(first) value.append(last) b_data[first] = value print "アルゴリズムで推薦した方",a_data print "評価用データ",b_data #あるユーザのrecommend(アルゴリズムで推薦したユーザ)と #click(実際にユーザがクリックしたユーザ)をパースしてやる np = 0 N = 0 NP = 0 for k in a_data.iterkeys(): N += 1 recommend = a_data[k] click = b_data[k] #おすすめしたアイテム一覧 #recommend = [10,20,30,40,50] #click = [10,30,40] h = [] for x in recommend: if x in click: h.append(1) else: h.append(0) #print h #hを積算したもの(npの計算で用いる) h_ac = [] num = 0 for x in h: if x == 1: num += x h_ac.append(num) else: h_ac.append(0) #print "ヒットの通算",h_ac # π = Σ h(t) pi = 0 for x in h: pi += x #print pi np = 0 for n in range(1,len(recommend)+1): np_i = 0 for i in range(1,n+1): #np_iの計算 #print "i = ",i #print "h_ac[i-1] / i=",h_ac[i-1] / (i * 1.0 ) np_i += (h_ac[i-1]) / (i * 1.0) #print "np_i =",np_i #print "np_i = ",np_i np += np_i #print "*********n = ",n #print "np = ",np print "あるユーザの平均適合率 ap=",np #nまでの平均適合率1/π Σp(t) NP += np NP = NP / (N *1.0) print "アルゴリズムのスコア:",NP
入力データのフォーマットを以下に示す。
algorithm.txtが自分で計算した方。estimation.txtが評価用のデータ。
おすすめされるユーザ\tおすすめするユーザ
...
の形式で書く。例えば以下。
1 10 1 20 1 30 1 40 1 50 2 10 2 20 2 30 2 40 3 10 3 20 3 30
1番さんに10番、20番、30番、40番、50番をおすすめしている。
ちなみにおすすめされるユーザでソートしておかないと
プログラムが動かないので注意。
計算結果。