基于用户评分推荐电影

来自CloudWiki
跳转至: 导航搜索

第5章、第6章 数据集:http://files.grouplens.org/datasets/movielens/ml-latest-small.zip

放到程序目录中即可

第5章:movielens_als_recommendation.py

第6章: movielens_lda_recommendation.py

安装SPARK、Hadoop

1、安装JAVA1.8   cmd中 java -version查看java版本

2、下载并解压spark 2.3.1
https://www.apache.org/dyn/closer.lua/spark/spark-2.3.1/spark-2.3.1-bin-hadoop2.7.tgz
环境变量 
SPARK_HOME = F:\spark-2.3.1-bin-hadoop2.7
Path添加 %SPARK_HOME%/bin

3、下载并解压hadoop
https://archive.apache.org/dist/hadoop/common/hadoop-2.7.6/
环境变量 
HADOOP_HOME = F:\hadoop-2.7.6\hadoop-2.7.6
Path添加 %HADOOP_HOME%/bin

4、pip install py4j

5、Pycharm => Run => Edit Configurations => Environment Variables => SPARK_HOME = F:\spark-2.3.1-bin-hadoop2.7
								     HADOOP_HOME = F:\hadoop-2.7.6\hadoop-2.7.6

6、复制F:\spark-2.3.1-bin-hadoop2.7\spark-2.3.1-bin-hadoop2.7\python\pyspark 到C:\Python36\Lib\site-packages中

7、将winutils.exe复制到F:\hadoop-2.7.6\hadoop-2.7.6\bin下

ALS算法

假设我们有一批用户数据,其中包含m个User和n个Item,则我们定义Rating矩阵Rm×n,其中的元素rui表示第u个User对第i个Item的评分。 在实际使用中,由于n和m的数量都十分巨大,因此R矩阵的规模很容易就会突破1亿项。这时候,传统的矩阵分解方法对于这么大的数据量已经是很难处理了。

另一方面,一个用户也不可能给所有商品评分,因此,R矩阵注定是个稀疏矩阵。矩阵中所缺失的评分,又叫做missing item。

图9

针对这样的特点,我们可以假设用户和商品之间存在若干关联维度(比如用户年龄、性别、受教育程度和商品的外观、价格等),我们只需要将R矩阵投射到这些维度上即可。这个投射的数学表示是:

图10

一般情况下,k的值远小于n和m的值,从而达到了数据降维的目的。

图11

幸运的是,我们并不需要显式的定义这些关联维度,而只需要假定它们存在即可,因此这里的关联维度又被称为Latent factor。k的典型取值一般是20~200。


这种方法被称为概率矩阵分解算法(probabilistic matrix factorization,PMF)。ALS算法是PMF在数值计算方面的应用。为了使低秩矩阵X和Y尽可能地逼近R,需要最小化下面的平方误差损失函数:

图12

优化上式,得到训练结果矩阵Xm×k,Yn×k。预测时,将User和Item代入rui=xTuyi,即可得到相应的评分预测值。同时,矩阵X和Y,还可以用于比较不同的User(或Item)之间的相似度,如下图所示:

图13

这里有一个重要假设,即所有的用户都至少看过一部电影,而所有电影都至少有一个用户看过。这样这两个矩阵的值都是非空的。比方说K的值为3,代表用户的年龄、性别、教育,那么通过训练,可以得到用户的购买情况受这三者的左右情况,以及商品的购买与否受这三者的左右情况。即这两个小矩阵每个元素的值。基于此,通过最后它们相乘,复原原先的大矩阵,原先大矩阵里为零的元素现在所被赋予的值,就是它的一个预测评分,一个基于用户大数据训练出来的预测评分。

在linux 上运行第5章程序

运行命令: spark/bin/spark-submit sercret/spark-movieLens/movielens_als_recommendation.py sercret/spark-movieLens/ml-latest-small