KDD2012 Track1 スコアの計算プログラム

スコアを計算するプログラムを書いた。

#! /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番をおすすめしている。
ちなみにおすすめされるユーザでソートしておかないと
プログラムが動かないので注意。

計算結果。