Weighted Slope One (python实现)

chapter 3 (collabative filtering ) of 《guide to db》

slope one 算法比较简单:1.先构造 collection of deviation(average deviation)

                                                2.weighted slope one ,已经打分的项+该项的deviation

代码:

users2 = {"Amy": {"Dr. Dog": 4, "Lady Gaga": 3, "Phoenix": 4},          
              "Ben": {"Dr. Dog": 5, "Lady Gaga": 2},          
              "Clara": {"Lady Gaga": 3.5, "Phoenix": 4}}

def computeDeviations(users):
    '''
    compute the deviations and return
    '''
    deviations = {}
    frequencies = {}
    for user in users.values():
        for key1 in user:
            frequencies.setdefault(key1,{}) #new method~!
            deviations.setdefault(key1,{})
            for key2 in user:
                if key1<>key2:
                    frequencies[key1].setdefault(key2,0)
                    deviations[key1].setdefault(key2,0)

                    deviations[key1][key2] += user[key1]-user[key2]
                    frequencies[key1][key2] += 1
            
    for key1 in deviations:
        for key2 in deviations[key1]:
            deviations[key1][key2] /= frequencies[key1][key2]
    return deviations,frequencies

def wS1(users, deviations,frequencies, user, item):
    '''
    make prediction :how user will rate the item? 
    '''
    if users[user].get(item)<>None:
        return users[user][item]
    itemPrediction = 0
    totalFrequency = 0
    for key in users[user]:
        if key<>item:
            itemPrediction += (users[user][key]+deviations[item][key])*frequencies[item][key]
            totalFrequency += frequencies[item][key]
    itemPrediction /= totalFrequency
    return itemPrediction
d,f = computeDeviations(users2)
print wS1(users2,d,f,'Ben','Phoenix')


版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2013-08-14 15:57  江小鱼2015  阅读(397)  评论(0编辑  收藏  举报

导航