推荐系统导论笔记(三)——Assignment 1

来源:互联网 发布:淘宝电子商务运营 编辑:程序博客网 时间:2024/05/21 21:48

数据描述

给定一个20×20的评分矩阵,其中行代表用户,列代表电影,每个单元格代表一个用户对一个电影的评分,评分在1~5之间,评分可能有缺失。该评分矩阵以csv文件给出,可于Coursera网站的推荐系统导论的课程页面下载,或者访问我github主页下载。github地址将在文末给出。


问题描述

本次作业任务是利用不同种的算法计算电影的评分,并按照评分输出电影的排序,具体评分算法包括:

  • 用户评分均值
  • 4星及以上评分所占比例
  • 评分数
  • 与电影Star War相关联程度

问题分析与编码

问题分析

问题中涉及到的算法都不是很复杂,值得一提的是第四个评价标准,官方给出的解决方案是利用|XY||X|算法解决。即将用户投票这一行为视作购买,然后套用产品联合推荐的思路解决。但这种方法完全忽视了用户评分的作用,因而在这种情况下,一般使用余弦相似度来描述两个Item间的相似程度。
此外,在编码时,还应考虑投票缺失的情况。

具体编码实现

Problem.py

该文件定义了一个Problem类,用于实现上述四种评价算法,其主要方法实现如下:

#评价算法1:用户评分均值def meanRating(self):        result=[]        #遍历评分矩阵的每一行,在读入数据时已经对数据做了转置,因此现在一行为一个电影的评分        for rating in self.ratings:            validRating=0 #有效的评分个数            ratingSum=0            for numOfStar in rating:                if numOfStar>-1: #如果评分有效,即没有缺失                    validRating=validRating+1 #自增                    ratingSum=ratingSum+numOfStar #累加            result.append(float(ratingSum)/validRating)#追加到结果中        return result #评分算法2:4星及以上评分所占比例 def highRating(self):        result=[]        #遍历评分矩阵的每一行        for rating in self.ratings:            validRating=0            numHighRating=0            for numOfStar in rating:#遍历评分                if numOfStar>-1: #如果评分有效                    validRating=validRating+1#有效评分数自增                if numOfStar>=4: #如果大于4星                    numHighRating=numHighRating+1 #高评分变量自增            result.append(float(numHighRating)/validRating)#追加到结果中        return result#评价算法3:有效评分个数    def ratingCount(self):        result=[]        #遍历评分矩阵的每一行        for rating in self.ratings:            result.append(len([i for i in rating if i>-1])) #追加结果        return  result    #计算相似度,使用|X and Y|/|X|方式;    #movieName:要计算相似度电影的名称    def calcRelevance(self,movieName):        index=-1        position=0        #首先找到该电影名称对应的下标        for name in self.moviesName:            if name==movieName:                index=position                break            position=position+1        if index==-1:            return -1        #再计算各个电影与其相似度        relevance=[]        #step1:计算给该电影投票的用户下标,即X集合        validRating=[i for i in range(0,len(self.ratings[index])) if self.ratings[index][i]>-1]        #遍历评分矩阵的每一行        for rating in self.ratings:            relevantCount=0            for i in validRating:                if rating[i]>-1: # 计算|X and Y|                    relevantCount=relevantCount+1            relevance.append(float(relevantCount)/len(validRating))#将|X and Y|/|X|结果存入列表        return relevance

代码Github地址:Github地址

0 0
原创粉丝点击