推荐算法——ALS算法原理及python代码实例

ALS算法原理及python代码实例

http://www.cnblogs.com/luchen927/archive/2012/02/01/2325360.html
上面的网页概括了ALS算法出现之前的协同过滤算法的概况。
协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息,回应不一定局限于特别感兴趣的,特别不感兴趣信息的纪录也相当重要。ALS算法是2008年以来,用的比较多的协同过滤算法。它已经集成到Spark的Mllib库中,使用起来比较方便。

从协同过滤的分类来说,ALS算法属于User-Item CF,也叫做混合CF。它同时考虑了User和Item两个方面。

用户和商品的关系,可以抽象为如下的三元组:<User,Item,Rating>。其中,Rating是用户对商品的评分,表征用户对该商品的喜好程度。
假设我们有一批用户数据,其中包含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

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值