本文参考文献:https://www.researchgate.net/publication/257403928_A_movie_recommendation_algorithm_based_on_genre_correlations
代码:https://github.com/827983519/recommend_algorithm/blob/master/Genre.py
1.电影推荐
电影推荐是推荐算法应用的重要场景。其中比较受欢迎的是基于内容的推荐算法以及协同滤波算法。其中基于内容的推荐算法通过分析电影的标题,演员等信息对用户进行推荐。而协同滤波算法的原理是物理类聚,人以群分,将兴趣爱好相同的人聚集起来,向他们推荐互相喜欢的电影。
但是这两种算法在信息不全时会无法使用。第一种算法需要获取电影的具体信息,以及用户的一些个人信息。而第二种方法会面临冷启动问题,即如果该用户是新加入的,或者是物品时新加进来的,那么就不会有任何历史行为。此时无法通过协同滤波进行推荐。
因此本人介绍一种仅仅基于电影类型以及用户的喜好类型,就能向用户进行推荐的算法。
2.Genre correlation计算
该算法的实践首先要计算Genre correlation。(这里中文GOOLE翻译给出的是种类相关系数,不知是否准确。因此用英文代替)。每部电影都会有不同的Genre,如玩具总动员的Genre是Animation|Children|Comedy。每部电影的Genre数目在2-3个左右。Genre correlation就是Genre互相的相关性。
具体计算方法是:首先我们建立Genre correlation table A,全部初始化为0。接着我们取出一部电影。再次以玩具总动员为例,该电影的Genre是Animation|Children|Comedy。我们
- 选取Animation为Criterion genre,因为该电影的Genre中Animaion后面还有Children和Comedy,所以A[Animation][Children]的数值加一,A[Animation][Comedy]加一。
- 选取Children为Criterion genre,因为该电影的Genre中Children后面还有Comedy,因此A[Children][Comedy]。
- 重复以上步骤,将所有的电影取出并且计算。
- 将获得的值与该Genre作为Criterion genre的次数相除,获得百分比。
最后我们会获得类似于下面的一张表:
3.Recommend point计算
计算Genre correlation之后,我们就可以计算每部电影对于每个用户的recommend point了。方法很简单,利用以下公式计算。其中mg代表选取的电影的Genres,而up代表用户的Preferred genre。每一次计算时,如果所选取的电影的genre是用户Preferred genre之一,则使用第一个公式。否则使用第二个。
下面这张图是一个计算的例子。
4.进行推荐
通过以上计算后,我们最终会得到这样一张表。其中Index是用户的ID,Columns是电影的ID。
接下来要做的就取决于个人。可以简单的对Recommend point进行排序,接着将最高的几部推荐出来。或者可以进行进一步过滤,比如只推荐热门的,或者平均评分在3分以上的。总而言之要根据自己期望获得的结果进行进一步操作。
实践中我使用的是Movielens提供的数据集。进行相关计算后,我向一位在训练集中的用户进行推荐。这位用户是一名孩子。我们可以看到推荐结果都是一些动画片之类的,说明效果还是不错的。