Code前端首页关于Code前端联系我们

Spark学习矩阵分解推荐算法

terry 2年前 (2023-09-27) 阅读数 65 #数据结构与算法

在协同过滤推荐算法中应用矩阵分解时,我们总结了矩阵分解在推荐算法中的应用原理。这里,我们使用Spark从实用角度学习矩阵分解推荐算法。

1。 Spark推荐算法概述

在Spark MLlib中,推荐算法仅实现了基于矩阵分解的协同过滤推荐算法。基于此的算法是FunkSVD算法,它将m个用户和n个项目对应的评分矩阵M分解为两个低维矩阵:Spark学习矩阵分解推荐算法

其中k是分解为低维的维数,一般要大得多。如果 m 和 n 小。如果您对FunkSVD算法不熟悉,可以先熟悉一下相应的原理。

2。 Spark推荐算法库介绍

Spark MLlib中,FunkSVD算法支持Python、Java、Scala、R接口。由于前面的实践章节都是基于Python,所以本文后面的介绍和使用也将使用MLlib的Python接口。 Spark MLlib推荐算法的python对应接口位于pyspark.mllib.recommendation包中。该包包含三个类:Rating、MatrixFactorizationModel 和 ALS。虽然它有三类,但算法只有FunkSVD算法。

下面介绍一下这三个类别的使用方法。 rating类比较简单,聚合了user、item和 rating这三个值。换句话说,Rating 类只有三元组Users、Items 和Ratings,并且没有功能接口。 ALS 负责训练我们的 FunkSVD 模型。这里之所以使用ALS,是因为Spark在优化FunkSVD矩阵分解目标函数时使用了ALS。函数

ALS有两个函数,一个是train,这个函数直接使用我们的评估矩阵来训练数据,而另一个函数trainImplicit稍微复杂一些,它使用隐式反馈数据来训练模型,这类似到火车功能。它还有另一个参数确定间接反馈的置信度阈值。例如,我们可以将评分矩阵转化为反馈数据矩阵,并根据一定的反馈原理将相应的评分值转化为置信度权重值。由于隐式反馈原则一般是根据具体问题和数据确定的,因此本文后面仅讨论标准评价矩阵分解。

MatrixFactorizationModel 类是我们使用 ALS 类训练的模型。这个模型可以帮助我们进行预测。常用的预测包括给定用户和给定项目对应的评分、用户最喜欢的 N 个项目、最可能喜欢该项目的 N 个用户、所有用户最喜欢的 N 个项目以及最喜欢的 N 个所有来自用户的项目。有N个喜欢这个的用户。稍后我们将通过示例解释这些类的使用。

3。 Spark推荐算法的重要参数

这里我们总结一下训练ALS模型的重要参数。

1) ratings:对应于评级矩阵的RDD。我们需要输入。如果是间接反馈,则为评分矩阵对应的间接反馈矩阵。

2)度:矩阵分解时对应的低维维度。即,尺寸 k 的单位为 PTm × kQk × nPm × kTQk × n。该值影响矩阵分解的性能。值越大,算法运行的时间越长,占用的内存也越多。通常需要调整参数,通常可以是10-200之间的数字。

3)迭代次数:使用交替最小二乘法求解矩阵分解时的最大迭代次数。该值取决于评估矩阵的维度以及评估矩阵的系数的秩。一般来说,不需要做太多次,5-20次即可。默认值为 5。

4)lambda:Python 接口使用 lambda_,因为 lambda 是 Python 保留字。该值就是FunkSVD分解时对应的调整因子。主要用于检查模型的拟合程度,增加模型的泛化能力。值越高,修正惩罚越强。大型推荐系统通常需要调整参数以获得合适的值。

5)alpha:此参数仅在使用隐式反馈trainImplicit时才有用。定义隐式反馈置信度阈值。值越高,用户与其评分的项目之间就越有可能不存在关系。一般来说,需要调整参数以获得合适的值。

从上面的描述可以看出,ALS算法使用起来非常简单。您需要注意需要调整的参数。主要参数是矩阵分解的维数和正则性超参数 lambda。如果是间接反馈,还必须调整间接反馈的置信阈值alpha。

4。 Spark推荐算法示例

下面我们通过一个具体的例子来描述Spark的矩阵分解推荐算法的使用。

这里我们使用MovieLens 100K数据。

数据解包后,我们只使用u.data文件中的评估数据。该数据集的每一行都有 4 列,分别对应用户 ID、项目 ID、评分和时间戳。由于我的机器比较破,所以在下面的例子中我只使用了前100个数据项。因此,如果您使用所有数据,您的预测将与我的不同。

首先需要确保已经安装了Hadoop和Spark(版本不低于1.6)并设置环境变量。我们一般在笔记本电脑(jupyternotebook)上学习ipython,所以最好搭建一个基于笔记本电脑的Spark环境。当然,如果你的笔记本上不使用Spark环境也没有关系,但每次启动前都需要设置环境变量。如果您的笔记本电脑上没有Spark环境,则需要先运行以下代码。当然,如果你已经设置好了,就不需要运行下面的代码了。

import os
import sys

#下面这些目录都是你自己机器的Spark安装目录和Java安装目录
os.environ['SPARK_HOME'] = "C:/Tools/spark-1.6.1-bin-hadoop2.6/"

sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/bin")
sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/python")
sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/python/pyspark")
sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/python/lib")
sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/python/lib/pyspark.zip")
sys.path.append("C:/Tools/spark-1.6.1-bin-hadoop2.6/python/lib/py4j-0.9-src.zip")
sys.path.append("C:/Program Files (x86)/Java/jdk1.8.0_102")

from pyspark import SparkContext
from pyspark import SparkConf

sc = SparkContext("local", "testing")
复制代码

在运行算法之前,建议按如下方式发出Spark Context。如果可以正常打印内存地址,则说明Spark环境已经准备好。

print sc
复制代码

例如我的输出是:

首先我们将u.data文件读取到内存中,并尝试输出第一行数据来检查是否读取成功。注意复制编码时,data目录必须使用自己的u.data目录。代码如下:

#下面目录要用解压后u.data所在的目录
user_data = sc.textFile("C:/Temp/ml-100k/u.data")
user_data.first()
复制代码

输出如下:

[u'196', u'242', u'3']

虽然我们已经收到了评分的数组对应的RDD矩阵此时的数据仍然是一个 String ,Spark 需要对应几个评级类别的数组。因此,我们现在转换RDD数据类型。代码如下:

from pyspark.mllib.recommendation import Rating
rates_data = rates.map(lambda x: Rating(int(x[0]),int(x[1]),int(x[2])))
print rates_data.first()
复制代码

输出如下:

Rating(user=196, Product=242, rating=3.0)

可以看出我们的数据已经是基于评级类RDD了,现在我们终于可以使用整理好的数据进行训练了。代码如下。我们设置矩阵分解维数为20,最大迭代次数为5,正则化系数为0.02。在实际应用中,我们需要通过交叉验证来选择合适的矩阵分解维数和正则系数。这里我们简化一下,因为它是一个例子。

from  pyspark.mllib.recommendation import ALS
from pyspark.mllib.recommendation import MatrixFactorizationModel
sc.setCheckpointDir('checkpoint/')
ALS.checkpointInterval = 2
model = ALS.train(ratings=rates_data, rank=20, iterations=5, lambda_=0.02)
复制代码

训练完模型后,我们终于可以对推荐系统进行预测了。先做最简单的预测,比如预测20个商品的38个用户评分。代码如下:

print model.predict(38,20)
复制代码

输出如下:

0.311633491603

分数不高。现在我们预测用户 38 最喜欢的 10 件商品。代码如下:

print model.recommendProducts(38,10)
复制代码

输出如下:

[ rating(user=38, Product=95, rating=4.995227969811873), rating(user=38, Product= 304, rating=304, rating= 2、4179)、R17418(用户= 38,产品= 1014,评级= 2.165428673820349),评级(用户= 38,产品= 322,评级= 1.7002266119079879),评级(用户= 38,产品= 111,评级= 1,20574) 2)、667742、产品= 196、评级= 1.0612630766055788、评级(用户= 38、产品= 23、评级= 1.0590775012913558)、评级(用户= 38、产品= 327、评级= 1.0335651317)、R8 =产品评级=0.9677333686628911) ,评分(用户=38,产品=181,评分=0.8536682271006641)]

可以看出,用户38可以点赞10个对应评分从高到低的商品。接下来,我们预测最有可能推荐第 20 个项目的 10 位用户。代码如下:

print model.recommendUsers(20,10)
复制代码

输出如下:

[ rating(user=115, Product=20, rating=2.9892138653406635), rating(user=25, Product=20, rating=1.579),247.58 (用户= 7,产品= 20,评级= 1.523935609195585),评级(用户= 286,产品= 20,评级= 1.3746309116764184),评级(用户= 222,产品= 20,评级= 1.313891405),R5 = 1.3138914051,R3产品= 20,评级= 1.254412853860262),评级(用户= 186,产品= 20,评级= 1.2194811581542384),评级(用户= 72,产品= 20,评级= 1.16518553199304),R4,26 = 0.2评级= 1.086339 1992741023),评级( user=160, Product=20, rating=1.072353288848142)]

现在让我们看看每个用户最推荐的三个项目。代码如下:

print model.recommendProductsForUsers(3).collect()
复制代码

由于输出很长,这里就不复制输出了。每一项最推荐的三位用户的代码如下:

print model.recommendUsersForProducts(3).collect()
复制代码

由于输出很长,这里就不复制输出了。希望上面的例子对使用Spark矩阵分解推荐算法的人有所帮助。

作者:步入量化学习Alice
来源:掘金

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门