UserCF推荐算法

import math
from operator import itemgetter

data = {'A': {'a','b','d'}, 'B': {'a','c'}, 'C': {'b','e'}, 'D': {'c','d','e'}}

def UserSimilarity(data):#calculate similarity between diffenenr users
    item_users = dict()
    for u,items in data.items():
        for i in items:
            if i not in item_users:#if i not appears in the item_users set create a new item set
                item_users[i] = set()
            item_users[i].add(u)    #add u into the item_users set

    #caculate co-rated items between users

    C = dict()
    for u in data.keys():#Create and initialize C to be a nest dict with value 0
        C[u] = dict()
        for v in data.keys():
            C[u][v] = 0
    #print C
    N = dict()
    for i, users in item_users.items():
            #print users
            for u in users:
                if u not in N.keys():#u is not in the key of N then set N[u]=1
                    N[u] = 1
                else :
                    N[u] += 1 #the num of item user u liked
                
                for v in users:
                    if u == v:
                        continue
                    C[u][v] += 1
                    #print u + ' -> ' + v + ' add 1'
                    #print C
            #print

    #calculate final similarity matirx W
    W = dict()
    for u , related_users in C.items():
        W[u] = dict()
        for v, cur in related_users.items():
            W[u][v] = C[u][v] / math.sqrt(N[u] * N[v])
    return W

def Recommend(data, W):#recommend algorithms
    rank = dict()#store the recommend result
    interacted_items = data#all items of users buy
    W_values = W.values()
    for u in W.keys():#ergodic all users
        #print W[u]
        rank[u] = dict()
        for v, wuv in sorted(W[u].items(), key = itemgetter(1), reverse = True)[0:3]:
            #sort the sequence of similarity between users u and v
            #print u,v, wuv
            rvi = 1
            '''
            for item_v in data[v]:#ergodic items user v buy
                if item_v in interacted_items[u]:#if user u also buyed item rvi (buyed by user v)
                    continue
                rvi = 1
            '''
            for item_v in data[v]:
                if item_v in interacted_items[u]:
                    continue
                #print v,item_v
                if item_v in rank[u]:
                    rank[u][item_v] += wuv * rvi
                else:
                    rank[u][item_v] = wuv * rvi
                #print u,v,rank[u][v]
    return rank
        
result = UserSimilarity(data)
'''for u, temp in result.items():
    for v ,finaResult in temp.items():
        print 'similarity between ' + u + ' and ' + v + ' is : ',
        print result[u][v]
'''
recommend = Recommend(data, result)
for i, temp in recommend.items():
    for j , final in temp.items():
        print 'The degree ' + i + '  interested in ' + j + ' is: ',
        print recommend[i][j]

 

posted on 2013-06-10 11:26  愤怒的屎壳螂  阅读(403)  评论(0编辑  收藏  举报

导航