基于用户评分推荐电影
第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