AI

協調フィルタリング(ピアソン相関)

from operator import itemgetter
from math import sqrt
data = {
'A': {'': 10, '': 5, '': 3, '': 4, '': 9, '': 6},
'B': {'': 3, '': 3, '': 3, '': 4, '': 3, '': 4},
'C': {'': 2, '': 10, '': 4, '': 2, '': 4},
'D': {'': 6, '': 3, '': 5, '': 2, '': 5},
'E': {'': 8, '': 4, '': 3, '': 2, '': 9},
'F': {'': 1, '': 2, '': 9, '': 3, '': 8},
'G': {'': 9, '': 4, '': 3, '': 4, '': 9, '': 5},
'H': {'': 10, '': 0, '': 1, '': 2, '': 5},
'I': {'': 9, '': 10, '': 10, '': 5, '': 3},
'J': {'': 3, '': 8, '': 8, '': 1, '': 5},
'K': {'': 7, '': 4, '': 1, '': 2, '': 9},
'L': {'': 8, '': 3, '': 1, '': 4, '': 1},
'M': {'': 1, '': 5, '': 4, '': 5, '': 5},
'N': {'': 1, '': 5, '': 4, '': 6, '': 3},
'O': {'': 10, '':4}
}
def get_pearson(data, person1, person2):
item_list = []
[item_list.append(item) for item in data[person1] if item in data[person2]]
n = len(item_list)
if n < 1: return 0
ave_1 = sum([data[person1][item] for item in item_list]) / n
ave_2 = sum([data[person2][item] for item in item_list]) / n
top = sum([(data[person1][item] - ave_1) * (data[person2][item] - ave_2) for item in item_list])
under = sqrt(sum([pow(data[person1][item] - ave_1, 2)for item in item_list])) * sqrt(sum([pow(data[person2][item] - ave_2, 2)for item in item_list]))
if under == 0: return 0
return top / under
#meに嗜好が似ている人順に並んだリストを返す
def get_similar_list(data, me):
person_list = {}
for person in data:
if person == me: continue
person_list[person] = get_pearson(data, me, person)
return sorted(person_list.items(), key = itemgetter(1), reverse = True)
a_sim = get_similar_list(data, 'A')
for person in a_sim:
print(person[0], person[1])

結果は、下記のように表示される。

O 1.0 G 0.9808680821138367 E 0.9484536082474225 K 0.9408299662818367 H 0.8827613485576769 D 0.6252910738779192 L 0.49037436997675116 C -0.2540244987629046 F -0.2553208668685789 I -0.3101395942331776 J -0.31251695558993137 B -0.3242687382284557 M -0.5561279983200484 N -0.8262633124961081