电影推荐之协同过滤

1.基于内容的推荐

  对于基于内容的推荐不多赘述,只说下基本的概念,根据用户已经评分且喜欢(评分高)的电影,为用户推荐和他过去喜欢的电影相似的电影,这里的相似就要依据电影的"内容"来计算了,例如电影的类型等等。

  利用到评分预测上,就是对于目标用户A和电影M,从A已经评价过的电影中找到与M相似的电影,利用这些电影的评分来预测用户A对M的评分。

2.协同过滤

  协同过滤算法主要分为基于用户的协同过滤算法和基于项目的协同过滤算法。

  基于用户的协同过滤通俗的来说呢,就是对于待预测的目标用户A及电影M,找到与A相似的且评价过M的用户,利用这些用户对M的评分来预测用户A对M的评分。

  基于项目的协同过滤呢,可以看作是基于用户的协同过滤的对偶(暂且这么说吧)。对于待预测的目标用户A及电影M,基于项目的协同过滤就是在A已评价过的电影中找到与M相似的那些电影,利用这些电影的评分来预测用户A对电影M的评分。看到这儿,你似乎很难理解基于内容的推荐和Item-Based CF的区别,事实上,它们的区别也确实很小,最关键性的区别就是:相似性的计算时,基于内容的推荐没有利用到用户信息,而Item-Based CF利用了用户信息,Item-Based CF计算两个电影M1和M2的相似性的时候,是依据用户对M1和M2的打分来计算的,例如用户A1、A2、A3对M1评分为3,3,3,用户A1、A2、A3对M2评分为3,4,3,那么M1和M2之间的相似度就是利用(3,3,3)和(3,4,3)来计算的(可用欧氏距离、余弦相似、皮尔森相似)。

3.User-Based算法实现

  整个程序是小组多个人一起做的,我做的是User-Based这部分,代码是C++写的,训练数据有200多M,所以一般的PC就别浪费时间跑完整数据了,我们是放在服务器上跑的,程序也容易修改,代码比较长。下面说说我的程序得思想。

算法思想:

  假设需要预测用户A对电影M的评分,首先对于电影M,根据训练数据集找出已经对电影M评过分的用户,然后计算A和这些用户之间的相似度,依据相似度和这些用户对M的评分,来预测用户A对电影M的评分。

  根据训练数据集找出已经对电影M评过分的用户很容易,预测结果的好坏关键在于如何计算用户A和这些用户之间的相似度,以及采用何种方式来利用相似度和评分预测出用户A对电影M的评分。

1)相似度计算

  已知电影1、2、3、4、5的风格如表格 1:

 
Action


Adventure


Comedy


Crime


Drama


Fantasy


Romance


Thriller


War


1



 

 

 

 

2

 


 


     

3

           

 


4


   


       

5

   

     


 

表格 1 电影风格

  假设用户A评价过的电影有1、3、4,用户B评价过的电影有1、2、5:

 
Action


Adventure


Comedy


Crime


Drama


Fantasy


Romance


Thriller


War


1



 

 

 

 

2

 


 


     

3

           

 


4


   


       

5

   

     


 

表格 2 用户A所选电影

 
Action


Adventure


Comedy


Crime


Drama


Fantasy


Romance


Thriller


War


1



 

 

 

 

2

 


 


     

3

           

 


4


   


       

5

   

     


 

表格 3 用户B所选电影

  于是用户A和用户B的类型表示为:

 
Action


Adventure


Comedy


Crime


Drama


Fantasy


Romance


Thriller


War


A


2


1

 
2


1


1


1


1


1


B


1


2


2


1


1


2


1


2

 

表格 4 用户A和B的类型表示

  计算A和B的相似度时,只选取A、B均有值的类型,对于没有同时有值的类型不参与计算:

 
Action


Adventure


Crime


Drama


Fantasy


Romance


Thriller


A


2


1


2


1


1


1


1


B


1


2


1


1


2


1


2

表格 5 实际有效的A和B类型维度

  至于相似度的计算方法,可采取:

  • 欧几里得距离
  • 余弦相似
  • 皮尔森相似

  计算过程中特殊情况简化处理:

  • 假如没有用户对要预测User::Movie评过分,直接用User看过的电影的平均分替代(更好的是利用相似电影的得分计算,但比较复杂)。
  • 假如两个用户之间没有任何重叠,相似度置为0。
  • 假如要预测User::Movie的User和所有看过该Movie的用户均无重叠风格,则对评分预测用User看过的电影的平均分替代

 2)评分预测

  预测分的计算过程如下:

  1. 首先,对于待预测的User::Movie,找出评价过Movie的用户Users[s]。
  2. 然后,计算User与这些用户之间的相似度sim(u,i)。
  3. 最后,利用

  预测用户u对电影m的评分

3)特殊情况处理

  • 假如没有用户对要预测User::Movie评过分,直接用User看过的电影的平均分替代(更好的是利用相似电影的得分计算,但比较复杂)。
  • 假如两个用户之间没有任何重叠,相似度置为0。
  • 假如要预测User::Movie的User和所有看过该Movie的用户均无重叠风格,则对评分预测用User看过的电影的平均分替代。

4)数据结构及程序流程图

  数据结构说明:


//用于存取用户基本信息,对应userid, movieid, score

vector<map<long, float> > users(80000);

//用户类型,用于计算相似度,对应userid, type, type的权值

vector<map<string, long> > users_type(80000);

//用于存储待测试用户的信息,包括userid, movieid, 实际score, 预测score

vector<map<long, pair<float,float> > > users_test(80000);

map<long, map<long, float> > users_sim;            //用于存储两个用户之间的相似度

map<int, vector<string> > movies;                 //用于存储电影的type

map<long, vector<int> > movie_users;                //用于存储看过某个电影的用户

  主程序流程图:

图 2 程序主体流程图

  相似度计算函数流程图(本来打算采取空间换时间效率的策略,存取计算过的用户间的相似度,但是发现空间消耗太大,服务器无法跑):

图 3 相似度计算流程图

5)RMSE


相似计算方法


RMSE


欧几里得距离


0.978840


余弦相似


0.979142


皮尔森相似


0.977616

代码和数据(代码并没有采取空间换时间策略,因为空间消耗真的不是一般的大,大概十几G,进程会被Kill):

http://pan.baidu.com/s/1pJDJEfL

http://pan.baidu.com/s/1mgMDnsO

数据该放在哪,具体看代码的main函数里面,自己改改路径,想放哪都行。

电影推荐之协同过滤,布布扣,bubuko.com

时间: 2024-10-06 16:41:48

电影推荐之协同过滤的相关文章

推荐算法-协同过滤推荐算法

layout: post title: "推荐算法-协同过滤推荐算法" date: 2020-4-13 9:00:00 categories: [Algorithm] excerpt: "协同过滤推荐算法简介,参考https://zhuanlan.zhihu.com/p/40463528" 协同过滤推荐算法步骤 1.收集用户偏好 推测用户的喜好就要收集用户的信息,用户收藏的类别,评论,下载,转发这些信息可以数字化,作为用户信息二维矩阵的变量. 2.用户数据的减噪和归

推荐系统介绍:(协同过滤)—Intro to Recommender Systems: Collaborative Filtering

本文试验前期准备: MovieLens  ml-100k数据集 Jupyter notebook themoviedb.org API key     添加python引用 import numpy as np import pandas as pd 进入MovieLens  ml-100k数据存放目录 cd F:\Master\MachineLearning\kNN\ml-100k 读取数据:u.data每行数据分为userid,itemid,rating,时间戳四部分 names = ['u

物理学背景下的推荐与协同过滤的理解

物理学背景的推荐算法与协同过滤 随着个性化推荐技术的发展,各种各样的推荐算法也竞相参与到这片新兴应用领域中进行开荒,一时间百花齐放,其中就有一些基于物理学背景的算法参与其中,本文阐述的是这篇文章在推荐算法上的主要内容,及其与传统的协同过滤算法在形式上的对比. 文章原名为<Solving the apparent diversity-accuracy dilemma of recommender systems>,要解决的正是当下推荐系统领域炙手可热的问题:怎样平衡推荐的精确度与多样性.作者的专

【Spark机器学习速成宝典】推荐引擎——协同过滤

目录 推荐模型的分类 条目2 条目3 条目4 条目5 条目6 条目7 条目8 条目9 推荐模型的分类 最为流行的两种方法是基于内容的过滤.协同过滤. 基于内容的过滤: 比如用户A买了商品A,商品B与商品A相似(这个相似是基于商品内部的属性,比如"非常好的协同过滤入门文章"和"推荐系统:协同过滤collaborative filtering"比较相似),那么就能将商品B推荐给用户. 协同过滤: 利用的是训练数据是大量用户对商品的评分,即(userID,productI

基于协同过滤的个性化Web推荐

         下面这是论文笔记,其实主要是摘抄,这片博士论文很有逻辑性,层层深入,所以笔者保留的比较多.          看到第二章,我发现其实这片文章对我来说更多是科普,科普吧-- 一.论文来源 Personalized Web Recommendation via Collaborative Filtering(很奇怪via为什么小写,先记住吧) (Candidate)博士研究生:孙慧峰 (Advisor)导师:陈俊亮(院士) (Academic Degree Applied for)

协同过滤浅谈

我们来谈谈最经典的推荐算法协同过滤吧,下面是思维导图拙作一副 协同过滤常常被用于分辨某位特定顾客可能感兴趣的东西,这些结论来自于对其他相似顾客对哪些产品感兴趣的分析.协同过滤以其出色的速度和健壮性,在全球互联网领域炙手可热. 与传统文本过滤相比,协同过滤有下列优点: (1)能够过滤难以进行机器自动基于内容分析的信息.如艺术品.音乐; (2)能够基于一些复杂的,难以表达的概念(信息质量.品位)进行过滤; (3)推荐的新颖性. 正因为如此,协同过滤在商业应用上也取得了不错的成绩.Amazon,CDN

基于Spark MLlib平台的协同过滤算法---电影推荐系统

基于Spark MLlib平台的协同过滤算法---电影推荐系统 又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用.其中,主要包括三部分内容: 协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,

推荐系统(recommender systems):预测电影评分--构造推荐系统的一种方法:协同过滤(collaborative filtering )

协同过滤(collaborative filtering )能自行学习所要使用的特征 如我们有某一个数据集,我们并不知道特征的值是多少,我们有一些用户对电影的评分,但是我们并不知道每部电影的特征(即每部电影到底有多少浪漫成份,有多少动作成份) 假设我们通过采访用户得到每个用户的喜好,如上图中的Alice喜欢爱情电影,不喜欢动作电影,则我们将θ(1)设为[0,5,0],如此设置θ(2),θ(3),θ(4)的值,这样我们有了每个用户的θ的值以及他们对电影的打分,就可以推断出每部电影的x(特征)的值.

探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤(转)

第 2 部分: 深入推荐引擎相关算法 - 协同过滤 本系列的第一篇为读者概要介绍了推荐引擎,下面几篇文章将深入介绍推荐引擎的相关算法,并帮助读者高效的实现这些算法. 在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.它以其方法模型简单,数据依赖性低,数据方便采集 , 推荐效果较优等多个优点成为大众眼里的推荐算法“No.1”.本文将带你深入了解协同过滤的秘密,并给出基于 Apache Mahout 的协同过滤算法的高效实现.Apache Mahout 是 ASF 的一个