美文网首页数据挖掘
第三章:Slope One算法

第三章:Slope One算法

作者: 无赖宵小 | 来源:发表于2018-10-24 21:51 被阅读50次

Slope One 算法是在一篇名为《Slope One:基于在线评分系统的协同过滤算法》的论文中提出的,由 Lemire 和 Machlachlan 合著。

Slope One 算法是另一种比较流行的基于物品的协同过滤算法,它最大的优势是简单,因此易于实现。

第一步:计算差值

差值计算

第二步:使用加权的 Slope One 算法进行预测

Slope One

分子:对于用户评价过的所有物品(除目标外),找出目标和这些物品之间的差值,并将差值加上用户对这个物品的评分。

同时,要将这个结果乘以同时评价过两件物品的用户数。

算法实现

第一步:

def computeDeviations(self):
    # 获取每位用户的评分数据
    for ratings in self:
        data.values()

self.data 是一个 Python 字典,它的 values() 方法可以获取所有键的值。

第二步:

def computeDeviations(self):
    # 获取每位用户的评分数据
    for ratings in self.data.values():
        # 对于该用户的每个评分项(歌手、分数)
        for (item, rating) in ratings.items():            
            self.frequencies.setdefault(item, {})            
            self.deviations.setdefault(item, {})

Python 字典的 setdefault() 方法接受两个参数,它的作用是:如果字典中不包含指定的键,则将其设为默认值;若存在,则返回其对应的值。

第三步:

def computeDeviations(self):
    # 获取每位用户的评分数据
    for ratings in self.data.values():
        # 对于该用户的每个评分项(歌手、分数)
        for (item, rating) in ratings.items():            
            self.frequencies.setdefault(item, {})            
            self.deviations.setdefault(item, {})
            # 再次遍历该用户的每个评分项
            for (item2, rating2) in ratings.items():
                if item != item2:
                    # 将评分的差异保存到变量中                    
                    self.frequencies[item].setdefault(item2, 0)
                    self.deviations[item].setdefault(item2, 0.0)
                    self.frequencies[item][item2] += 1                    
                    self.deviations[item][item2] += rating - rating2

第四步:

计算出差异值(公式的实现):

def computeDeviations(self):
    # 获取每位用户的评分数据
    for ratings in self.data.values():
        # 对于该用户的每个评分项(歌手、分数)
        for (item, rating) in ratings.items():            
            self.frequencies.setdefault(item, {})            
            self.deviations.setdefault(item, {})
            # 再次遍历该用户的每个评分项
            for (item2, rating2) in ratings.items():
                if item != item2:
                    # 将评分的差异保存到变量中                    
                    self.frequencies[item].setdefault(item2, 0)
                    self.deviations[item].setdefault(item2, 0.0)
                    self.frequencies[item][item2] += 1                    
                    self.deviations[item][item2] += rating - rating2
    for (item, ratings) in self.deviations.items():        
        for item2 in ratings:
            ratings[item2] /= self.frequencies[item][item2]

加权的 Slope One 算法:推荐逻辑的实现

def slopeOneRecommendations(self, userRatings):
    recommendations = {}
    frequencies = {}
    # 遍历目标用户的评分项(歌手、分数)
    for (userItem, userRating) in userRatings.items():
        # 对目标用户未评价的歌手进行计算
        for (diffItem, diffRatings) in self.deviations.items():
            if diffItem not in userRatings and userItem in self.deviations[diffItem]:
                freq = self.frequencies[diffItem][userItem]                
                recommendations.setdefault(diffItem, 0.0)
                frequencies.setdefault(diffItem, 0)
                # 分子
                recommendations[diffItem] += (diffRatings[userItem] + userRating) * freq
                # 分母
                frequencies[diffItem] += freq     
    recommendations = [(k, v / frequencies[k]) for (k, v) in recommendations.items()]
    # 排序并返回    
    recommendations.sort(key=lambda artistTuple: artistTuple[1], reverse=True)
    return recommendations

参考原文作者:Ron Zacharski CC BY-NC 3.0] https://github.com/egrcc/guidetodatamining

参考原文原文 http://guidetodatamining.com/

参考译文来自 @egrcchttps://github.com/egrcc/guidetodatamining

相关文章

网友评论

    本文标题:第三章:Slope One算法

    本文链接:https://www.haomeiwen.com/subject/pekftqtx.html