加重平均とは値A、B、Cが存在しそれぞれの個数がx、y、zであったとき
平均値を(Ax+By+Cz)/(A+B+C)で求めるもの
例えば国語のテストで考えると1組が人数30名で平均値が70点
2組が40名で平均値が80点だとすると
(70x30+80x40/(30+40)=75.71となります
from recommendation_data import dataset
from math import sqrt
from pearson import pearson_correlation
from pearson import pearson_correlation
def user_reommendations(person):
# 他のユーザーの加重平均によるランキングから推薦を求める
totals = {}
simSums = {}
for other in dataset:
# 自分自身は比較しない
if other == person:
continue
sim = pearson_correlation(person, other)
totals = {}
simSums = {}
for other in dataset:
# 自分自身は比較しない
if other == person:
continue
sim = pearson_correlation(person, other)
# ゼロ以下のスコアは無視する
if sim <= 0:
continue
for item in dataset[other]:
if sim <= 0:
continue
for item in dataset[other]:
# まだ所持していない(食べてないメニュー)アイテムのスコア
if item not in dataset[person] or dataset[person][item] == 0:
if item not in dataset[person] or dataset[person][item] == 0:
# Similrity * スコア
totals.setdefault(item, 0)
totals[item] += dataset[other][item] * sim
# 類似度の和
simSums.setdefault(item, 0)
simSums[item] += sim
totals.setdefault(item, 0)
totals[item] += dataset[other][item] * sim
# 類似度の和
simSums.setdefault(item, 0)
simSums[item] += sim
# 正規化されたリストを作成
rankings = [(total / simSums[item], item)
for item, total in list(totals.items())]
rankings.sort()
rankings.reverse()
# 推薦アイテムを返す
recommendataions_list = [
recommend_item for score, recommend_item in rankings]
return recommendataions_list
for item, total in list(totals.items())]
rankings.sort()
rankings.reverse()
# 推薦アイテムを返す
recommendataions_list = [
recommend_item for score, recommend_item in rankings]
return recommendataions_list
print("伊藤さんにおすすめのメニュー",
user_reommendations('伊藤'))
user_reommendations('伊藤'))
伊藤さんにおすすめのメニュー ['かつ丼', '牛丼']