发布时间:2023-06-30 08:00
http://www.cnblogs.com/luchen927/archive/2012/02/01/2325360.html
上面的网页概括了ALS算法出现之前的协同过滤算法的概况。
协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。ALS算法是2008年以来,用的比较多的协同过滤算法。它已经集成到Spark的Mllib库中,使用起来比较方便。
从协同过滤的分类来说,ALS算法属于User-Item CF,也叫做混合CF。它同时考虑了User和Item两个方面。
用户和商品的关系,可以抽象为如下的三元组:
假设我们有一批用户数据,其中包含m个User和n个Item,则我们定义Rating矩阵,其中的元素表示第u个User对第i个Item的评分。
在实际使用中,由于n和m的数量都十分巨大,因此R矩阵的规模很容易就会突破1亿项。这时候,传统的矩阵分解方法对于这么大的数据量已经是很难处理了。
另一方面,一个用户也不可能给所有商品评分,因此,R矩阵注定是个稀疏矩阵。矩阵中所缺失的评分,又叫做missing item。
针对这样的特点,我们可以假设用户和商品之间存在若干关联维度(比如用户年龄、性别、受教育程度和商品的外观、价格等),我们只需要将R矩阵投射到这些维度上即可。
使得:
幸运的是,我们并不需要显式的定义这些关联维度,而只需要假定它们存在即可,因此这里的关联维度又被称为Latent factor。k的典型取值一般是20~200。
为了使低秩矩阵X和Y尽可能地逼近R,需要最小化平方误差损失函数。
优化上式,得到训练结果矩阵。预测时,将User和Item代入,即可得到相应的评分预测值。
ALS算法的缺点在于:
1.它是一个离线算法。
2.无法准确评估新加入的用户或商品。这个问题也被称为Cold Start问题。
Python实例:
对Movelens进行电影推荐:
# 使用pyspark-ALS进行矩阵分解
from pyspark import SparkContext
from pyspark.mllib.recommendation import ALS
"""ALS算法是2008年以来,用的比较多的协同过滤算法。它已经集成到Spark的Mllib库中,使用起来比较方便。"""
import os
os.environ['JAVA_HOME'] = 'E:/Program/Java' # 这里的路径为java的bin目录所在路径\,视每个人的情况而定
print("使用Spark-ALS算法")
sc = SparkContext('local', 'MovieRec')
"""Spark功能的主要入口点。
SparkContext表示与Spark集群的连接,可用于在该集群上创建RDD和广播变量。"""
# 读取数据,需要第一行不是列名
rawUserData = sc.textFile('ratings_small_without_header.csv') #通过文件系统构建RDD
print(rawUserData.count()) #打印的数据的条数
print(rawUserData.first()) #打印第一条数据
rawRatings = rawUserData.map(lambda line: line.split(",")[:3]) #将函数应用于 RDD 的每个元素,返回值是新的 RDD
print(rawRatings.take(5)) #从 RDD 中返回5个元素
training_RDD = rawRatings.map(lambda x: (x[0], x[1], x[2]))
# 模型训练
rank = 3 #rank相当于聚类个数和embedding的维度
model = ALS.train(training_RDD, rank, seed=5, iterations=30, lambda_=0.1)
# 针对user_id = 100的用户进行Top-N推荐
print(model.recommendProducts(100, 5))
print(model.recommendUsers(67504,2))#对产品67504进行推荐给top-2用户
print('Over!')
数据集:ratings_small_without_header.csv
链接:https://pan.baidu.com/s/1x73YtQHjY5HUk3K1M6_8MQ
提取码:tuuu