美文网首页数据挖掘
第三章: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