参考文献などを見てみると、Pythonについての文献しか出てこなかったのでここで質問します。
ピアソンの積率相関係数など、必要最低限の勉強はしています。
http://gihyo.jp/dev/serial/01/informati ... ystem/0005
こちらのサイトを参考に勉強しています。
その中の協調フィルタリングについてが良く理解できません。
Userとitemの部分についてのコードを説明していただけるとありがたいです。
下はソースコードです
#! /usr/local/bin/python
# -*- coding:utf-8 -*-
import sys
def jaccard(v1, v2):
"""
jacard係数を求める
"""
v1_and_v2 = 0.
v1_or_v2 = 0.
for i in xrange(len(v1)):
if v1[i] == 1 or v2[i] == 1:
v1_or_v2 += 1
if v1[i] == 1 and v2[i] == 1:
v1_and_v2 += 1
try:
return v1_and_v2 / v1_or_v2
except ZeroDivisionError:
return 0.0
def calc_users_similarity(user_id, user_data, sim=jaccard):
"""
userとuserの類似度を求める
"""
users_similarity = {}
for target_id in xrange(len(user_data)):
if target_id == user_id:
continue
users_similarity[target_id] = sim(
user_data[user_id], user_data[target_id])
return users_similarity
def calc_user_average_score(user_id, user_data):
"""
ユーザーの平均スコア
"""
return sum(user_data[user_id]) / len(user_data[user_id])
def userbase_scoring(user_id, item_id, user_data, users_similarity):
"""
userとitemのスコアを求める
"""
if user_data[user_id][item_id] == 1.:
return -1. * sys.maxint
ave_score = calc_user_average_score(user_id, user_data)
bunshi = 0.
bunbo = 0.
for target_id in xrange(len(user_data)):
if target_id == user_id:
continue
bunshi += users_similarity[target_id] * (
user_data[target_id][item_id]
- calc_user_average_score(target_id, user_data)
)
bunbo += users_similarity[target_id]
return ave_score + (bunshi/bunbo)
if __name__ == "__main__":
user_data = [[1., 0., 1., 0.],
[1., 0., 0., 1.],
[1., 1., 1., 0.],
[0., 1., 0., 0.]]
user_id = int(sys.argv[1])
users_similarity = calc_users_similarity(user_id, user_data, sim=jaccard)
for item_id in xrange(len(user_data[0])):
print "item{}:".format(item_id),
print userbase_scoring(user_id, item_id, user_data, users_similarity)