CWYAlpha

Just another WordPress.com site

Thought this was cool: 推荐系统应用(一)—电影类

leave a comment »


不同的推荐系统算法可以做出不同的特色产品,同样的算法在不同的产品中也会有不同的用法和组合。

我想在这篇博客中,虚构一个web服务来应用所学的算法。

假设MovieRecommendation.com是一个为互联网用户提供电影推荐的网站(下面成为MR),这个网站只提供电影的链接而不提供电影的内容展示。(这个是和hulu,土豆等一些视频网站不同的地方)

在开始介绍整个网站之前,我们先假设我们拥有丰富的数据源,和许多正版的数据提供商有合作关系。

这个网站和推荐系统有关的包括以下几个部分:

1、数据仓库

搭建数据仓库的作用就是为了方便网站在提供服务以及进行数据挖掘的时候可以很方便地取到一定格式的数据。

MR的数据仓库主要包括:

  • 用户的评分矩阵
  • 推荐系统计算出来的预测评分矩阵
  • 电影的meta data
  • 用户兴趣模型
  • 电影的相似度矩阵
  • 用户行为数据
  • 用户的相似度矩阵

2、推荐系统部分

针对这个网站的特点,考虑到cold start 的问题,我们可以准备两个推荐系统。

(1)基于collaborative filtering的推荐系统

推荐系统的输入项是从数据仓库中取出的用户评分矩阵(一个非常非常稀疏的矩阵),输出项为预测评分矩阵(这个矩阵是个稠密矩阵,因为是用推荐算法计算之后得到的预测值来填充的矩阵)。

网站刚刚开始的时候,我们主要采用svd算法计算出用户的预测评分矩阵,然后将这个结果作为输入,用item-based cf计算出的预测评分矩阵作为最终的结果,存到数据仓库中。

当数据很多的时候,要用user-based cf来计算相似用户以及和其他算法混合推荐,以增加结果的丰富性。

(2)基于内容的推荐系统

因为考虑到系统的cold start问题,所以要做一个基于内容的、和用户行为无关的、可以离线计算好后“一劳永逸”的基于内容的推荐系统。

首先,从数据仓库中提取出电影的meta data做聚类,电影的tag(流派、演员、导演、时间等等)作为聚类的维度,用rock算法对数据进行聚类。

聚类之后,在各类中分别利用这些tag作为计算相似度的数值指标计算出电影的相似度矩阵,这个是一个上三角矩阵,所以存储也可以省掉一半空间。

然后,将电影的相似度矩阵存入数据仓库中,并定期地更新这些矩阵。

3、用户行为转化系统

用户在使用网站的时候会产生大量的行为,这些行为会反映出很多的信息,比如他们对某一部电影的喜好或者厌恶,比如他们对我们的推荐结果的满意度。

在这里,我们会用到的用户行为会有:

  • 搜索
  • 浏览
  • 评分
  • 评论
  • 收藏
  • 分享
用户行为转化系统的作用是将用户产生的大量行为量化处理,转换为用户对这个item喜好程度的数据表达。
这中间可能会有很多不到位的地方,比如:一个用户他搜索一个关键词得到若干页面后,他点击了其中的一个页面,我们是认为他喜欢还是不喜欢这个item呢?只有评分和评论是最最靠得住的数据,而收藏和分享次之,但也比较有说服力。而浏览和搜索的说服力最差。
另外,还有一个问题就是,不同的行为转换为分数的尺度不一致,需要做一个归一化处理。
4、反馈系统
这个系统的作用是为了评估推荐系统的推荐效果。
评价一个推荐系统效果好坏的指标有很多种,但在实际的应用中可能更关注的是转化率(尤其是电商)。
对于我们的网站,转化率体现在用户对推荐的电影表示喜欢,他可能评了很高的分数,可能给了一个好评,也可能将这部电影分享到了新浪围脖。但很多时候,中国的网民并不喜欢作反馈,尤其是他喜欢你的这个推荐结果的时候。但往往是,如果他不喜欢,他会反馈给你一句话,你的网站好烂啊,从此就不再访问了。
另外,在做论文谋学位的童鞋常常用到的是误差,将系统的数据分为训练集和测试集(前者占90%,后者占10%)。
通过用训练集的数据训练自己的算法,然后做出推荐,然后和测试集来作比较求误差。(MAE或者RMSE)
不断地迭代上述过程,得到最佳的参数,比如svd降维降多少,kNN中取前多少个k等等很多参数。
这里,我们会用两种方式来做反馈系统。
从数据仓库中取出数据后,用误差指标不断地优化算法的各种参数,用转化率作为评价指标。
如果在做的时候发现,推荐的效果不佳的话,可以考虑加入新的算法做A/B test,以确定哪种算法更有效。
5、用户兴趣模型建立
当用户不断地产生数据,建立一个用户的兴趣模型就显得非常必要。
用户的兴趣是个时间和兴趣向量的多元函数。
用户的兴趣可以用几个带有权值的关键词来描述,可以写成行向量和列向量的乘积,行向量是各个兴趣的权重,列向量是各个兴趣。兴趣向量可以通过统计用户喜欢的电影中的关键词来得到。其实在产品展示的时候可以用标签云来说明。(每个标签就是用户的兴趣,标签的大小代表权重)
另外,用户的兴趣还是时间的函数,因为兴趣这种东西是随着时间而慢慢变化的。
用户兴趣模型建立好之后,很容易带来经济回报。道理很简单,你知道某个人喜欢什么,你投放的广告自然就会很精准。
下面来模拟用户使用网站的情况:
当一个用户在新浪围脖上看到了我们的网站MovieRecommendation,点击进入,经过简单地注册之后,用户需要输入几个他喜欢的词,比如搞笑,惊悚,汤姆克鲁斯等等。然后用户会进入一个问答环节。我承认问答环节,总是很让人讨厌,但聪明的产品经理会把这个问答环节做得非常的棒。
在问答环节,用户会看到一个像自动播放的电子相册的东西,每张图片上会显示一部电影的详细情况,包括电影的海报,电影的名字,电影的导演和演员,电影的简介,最最重要的是,有一个问题,包括两个选项:
  • 您给这个电影打个分呗(后面是五颗星,即:用户可以打1-5分)
  • 太可惜了,您没看过这部电影?那请点击我。
提供哪些电影是很讲究的,你需要从基于内容的聚类后得到的各个簇中随机选择若干很hot的电影。记得,电影一定要多样化,而且每个簇都准备几部备用的,但不宜过多,因为用户如果发现你给他看的电影都是他没看过的,他一定不和你玩了。
经过这一步,我们就会得到这个用户对几个簇中的电影的评分。这一步,在某种意义上缓解了下cold start的问题。
用户从问答环节中解脱出来以后,他会看到目前最火的电影列表(来自于大众化的推荐结果)
他可能会点击某个电影页面进行浏览,当他点开后他会看到和这部热片相似的若干电影(因为刚刚开始的时候cf不能很好的工作,所以推荐结果会用基于内容的推荐。)
用户也可能会搜索某部电影,如果他搜索到了的话,那非常好,但一旦他没有搜索到这部电影的话,我想我们不应该傻傻地对他说,抱歉,您找的电影我们没有。(这个时候,聪明的做法是:您好,我们已经记录好您的搜索需求,当我们拥有了这个电影的时候,会第一时间联系您)
网站运营了一段日子了,也积累起大量的用户,我们拥有很多的数据之后,
当用户打开某个页面,他可能会看到:
  • 和这个电影相似的电影有。。。
  • 看过这个电影的人还看过。。。
  • 谁也看过这个电影。。。
  • 您可能喜欢这些电影。。。
这些美妙的结果正是因为cf算法发挥了作用。
这个时候,网站也具有了社交性,通过cf可以算出具有相同taste的用户群。
为用户推荐的结果更加丰富。
当然,用户可以在自己的个人主页上看到自己的兴趣向量,以标签云的形式展现出来。
好了,下面说说推荐系统在线上是怎么工作的。
1、猜你喜欢的电影
  • 针对目标用户,服务器从数据仓库中提取该用户在预测评分矩阵的那一行中的前30部电影和分数(按预测分数),形成一个粗糙的推荐列表
  • 因为列表中有用户明显表达过喜欢的或者看过的或者他很讨厌的电影,所以要对那个列表进行过滤。
  • 然后对上一步得到的列表进行排序输出到前台展示。
2、相关电影
  • 针对目标电影,服务器从数据仓库中提取该电影在电影相似矩阵中的前8部电影(按相似度排序)
好了,以上就是这个虚构的电影推荐网站的所有内容。
我个人感觉,
  • 数据的积累和数据仓库的搭建是最最重要的基础工作。
  • 对用户行为数据的分析是最大的技术难点。
  • 当然,如果你的网站做大了,海量数据本身就是个巨大的挑战。
这篇文章纯属本人YY,欢迎高手批评指正。

 

 

 

 

 

from 阿俊的博客: http://somemory.com/myblog/?post=13

Written by cwyalpha

五月 22, 2012 在 3:24 上午

发表在 Uncategorized

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: