import math
def ItemSimilarity(train):
C= dict()
N=dict()
for u,items in train.items():
for i in items.keys():
if i not in N.keys():
N[i]=0
#N[i] += 1
N[i] += items[i] * items[i]
for j in items.keys():
if i == j:
continue
if i not in C.keys():
C[i]=dict()
if j not in C[i].keys():
C[i][j]=0
#C[i][j]+= 1
C[i][j]+= items[i] * items[j]
W =dict()
for i,related_items in C.items():
if i not in W.keys():
W[i]=dict()
for j,cij in related_items.items():
#W[i][j] = cij / math.sqrt( N[i] * N[j])
W[i][j] = cij / (math.sqrt(N[i]) * math.sqrt(N[j]))
return W
# if __name__== '__main__':
# Train_Data = {'A':{'i1':1,'i2':1 ,'i4':1},
# 'B':{'i1':1,'i4':1},
# 'C':{'i1':1,'i2':1,'i5':1},
# 'D':{'i2':1,'i3':1},
# 'E':{'i3':1,'i5':1},
# 'F':{'i2':1,'i4':1}
# }
# W=ItemSimilarity(Train_Data)
def Recommend(train,user_id,W,K):
rank=dict()
ru = train[user_id]
for i,pi in ru.items():
tmp=W[i]
for j,wj in sorted(tmp.items(),key=lambda d: d[1],reverse=True)[0:K]:
if j not in rank.keys():
rank[j]=0
if j in ru:
continue
rank[j] += pi*wj
print("pi: ", pi, "wj: ", wj, "rank[j]: ", rank[j])
return rank
if __name__== '__main__':
# Train_Data = {
# 'A':{'i1':1,'i2':1 ,'i4':1},
# 'B':{'i1':1,'i4':1},
# 'c':{'i1':1,'i2':1,'i5':1},
# 'D':{'i2':1,'i3':1},
# 'E':{'i3':1,'i5':1},
# 'F':{'i2':1,'i4':1}
# }
# 100 1 4.0
# 100 2 2.0
# 100 3 3.0
# 101 1 5.0
# 101 2 2.0
# 101 3 4.0
# 101 4 4.0
# 102 1 3.0
# 102 3 4.0
# 102 4 5.0
# 102 7 6.0
# 103 1 1.0
# 103 3 3.0
# 103 4 4.0
# 103 6 5.0
# 104 1 2.0
# 104 2 2.0
# 104 3 3.0
# 104 4 4.0
# 104 5 5.0
# 104 6 6.0
Train_Data = {
'100':{'i1':4,'i2':2 ,'i3':3},
'101':{'i1':5,'i2':2 ,'i3':4,'i4':4},
'102':{'i1':3,'i3':4,'i4':5,'i7':6},
'103':{'i1':1,'i3':3,'i4':4,'i6':5},
'104':{'i1':2,'i2':2 ,'i3':3,'i4':4,'i5':5,'i6':6}
}
# Train_Data = {
# '100':{'i1':1,'i2':1 ,'i3':1},
# '101':{'i1':1,'i2':1 ,'i3':1,'i4':1},
# '102':{'i1':1,'i3':1,'i4':1,'i7':1},
# '103':{'i1':1,'i3':1,'i4':1,'i6':1},
# '104':{'i1':1,'i2':1 ,'i3':1,'i4':1,'i5':1,'i6':1}
# }
W=ItemSimilarity(Train_Data)
res = Recommend(Train_Data,'100',W,10)
print(sorted(W.items(),key=lambda d: d[0],reverse=False))
print('-------------------------------------------------------')
print(sorted(res.items(),key=lambda d: d[1],reverse=True)[0:10])
# wres ={
# 'i1': {'i2': 0.5773502691896258, 'i5': 0.4082482904638631, 'i4': 0.6666666666666666},
# 'i2': {'i1': 0.5773502691896258, 'i3': 0.35355339059327373, 'i5': 0.35355339059327373, 'i4': 0.5773502691896258},
# 'i3': {'i2': 0.35355339059327373, 'i5': 0.5},
# 'i4': {'i1': 0.6666666666666666, 'i2': 0.5773502691896258},
# 'i5': {'i1': 0.4082482904638631, 'i3': 0.5, 'i2': 0.35355339059327373}
# }
# -------------------------------------------------------
# rc = {'i1': 0, 'i3': 0.8535533905932737, 'i2': 0, 'i5': 0, 'i4': 1.2440169358562925}
# [('i1', {'i3': 0.9303974663016137, 'i2': 0.8563488385776754, 'i5': 0.26967994498529685, 'i4': 0.7417457782164102, 'i7': 0.40451991747794525, 'i6': 0.2934963192593358}),
# ('i2', {'i1': 0.8563488385776754, 'i3': 0.751646028002829, 'i5': 0.5773502691896258, 'i4': 0.5405899027195888, 'i6': 0.44353276257274377}),
# ('i3', {'i1': 0.9303974663016137, 'i2': 0.751646028002829, 'i5': 0.39056673294247163, 'i4': 0.9142475696046328, 'i7': 0.5207556439232955, 'i6': 0.5500764048069255}),
# ('i4', {'i1': 0.7417457782164102, 'i3': 0.9142475696046328, 'i2': 0.5405899027195888, 'i5': 0.4681645887845223, 'i7': 0.585205735980653, 'i6': 0.6593656656734125}),
# ('i5', {'i1': 0.26967994498529685, 'i3': 0.39056673294247163, 'i2': 0.5773502691896258, 'i4': 0.4681645887845223, 'i6': 0.7682212795973759}),
# ('i6', {'i1': 0.2934963192593358, 'i3': 0.5500764048069255, 'i2': 0.44353276257274377, 'i5': 0.7682212795973759, 'i4': 0.6593656656734125}),
# ('i7', {'i1': 0.40451991747794525, 'i3': 0.5207556439232955, 'i4': 0.585205735980653})]
# -------------------------------------------------------
# [('i4', 6.7909056271187165), ('i6', 3.7112800166036077), ('i5', 3.4051205171478536), ('i7', 3.1803466016816677), ('i1', 0), ('i3', 0), ('i2', 0)]

未经允许不得转载:
红吉他 »
JAVA »
演示