演示

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)]


image.png