学食でも社内食堂でも良いのですが、カレー、ラーメン、かつ丼、天丼、牛丼、うどん
それぞれのメニューに5点満点で7人の人に評価してもらいました。
もちろん、一度も食べたことがないメニューは各自データには出ていません。
dataset = {
'佐々木': {'カレー': 2.5,
'ラーメン': 3.5,
'かつ丼': 3.0,
'天丼': 3.5,
'牛丼': 2.5,
'うどん': 3.0},
'吉田': {'カレー': 3.0,
'ラーメン': 3.5,
'かつ丼': 1.5,
'天丼': 5.0,
'うどん': 3.0,
'牛丼': 3.5},
'伊藤': {'カレー': 2.5,
'ラーメン': 3.0,
'天丼': 3.5,
'うどん': 4.0},
'宮本': {'ラーメン': 3.5,
'かつ丼': 3.0,
'うどん': 4.5,
'天丼': 4.0,
'牛丼': 2.5},
'野村': {'カレー': 3.0,
'ラーメン': 4.0,
'かつ丼': 2.0,
'天丼': 3.0,
'うどん': 3.0,
'牛丼': 2.0},
'遠藤': {'カレー': 3.0,
'ラーメン': 4.0,
'うどん': 3.0,
'天丼': 5.0,
'牛丼': 3.5},
'中野': {'ラーメン': 4.5,
'牛丼': 1.0,
'天丼': 4.0}}
テストとして上のデータを読み出してみる。
from math import sqrt
dataset['佐々木']['カレー'])))
print(("佐々木さんのうどんの評価 : {}\n".format(
dataset['佐々木']['うどん'])))
print(("伊藤さんのカレーの評価: {}".format(
dataset['伊藤']['カレー'])))
print(("伊藤さんのうどんの評価: {}\n".format(
dataset['伊藤']['うどん'])))
佐々木さんのうどんの評価 : 3.0
伊藤さんのうどんの評価: 4.0
from math import sqrt
# 戻り値は person1 と person2 のユークリッド距離
if item in dataset[person2]:
both_viewed[item] = 1
if len(both_viewed) == 0:
return 0
sum_of_eclidean_distance = []
if item in dataset[person2]:
sum_of_euclidean_distance.append(
pow(dataset[person1][item] - dataset[person2][item], 2))
total_of_euclidean_distance = sum(sum_of_euclidean_distance)
similarity_score('佐々木', '野村'))
from math import sqrt
both_rated = {} # Σx と y共通の項目 i
for item in dataset[person1]:
if item in dataset[person2]:
both_rated[item] = 1
if number_of_ratings == 0:
return 0
person1_preferences_sum = sum(
[dataset[person1][item] for item in both_rated]) # Σx_i
person2_preferences_sum = sum(
[dataset[person2][item] for item in both_rated]) # Σy_i
person1_square_preferences_sum = sum(
[pow(dataset[person1][item], 2) for item in both_rated]) # Σx_i^2
person2_square_preferences_sum = sum(
[pow(dataset[person2][item], 2) for item in both_rated]) # Σy_i^2
product_sum_of_both_users = sum(
[dataset[person1][item] * dataset[person2][item] for item in both_rated]) # Σx_i * y_i
numerator_value = product_sum_of_both_users - \
(person1_preferences_sum * person2_preferences_sum / number_of_ratings) # Σ(x_i * y_i )/N
denominator_value = sqrt((person1_square_preferences_sum - pow(person1_preferences_sum, 2) / number_of_ratings) * ( # √{{Σx_i^2 - (Σx_i)^2 }/N]*√[{y_i^2 - (Σy_i)^2}/N}
person2_square_preferences_sum - pow(person2_preferences_sum, 2) / number_of_ratings))
if denominator_value == 0: # 分母が0になるのを避ける
return 0
else:
r = numerator_value / denominator_value # Σ(x_i * y_i )/[√{Σx_i^2 - (Σx_i)^2 }*√{y_i^2 - (Σy_i)^2}]
return r
(pearson_correlation('佐々木', '野村')))