推荐系统算法--ItemCF--MF(ALS)--FF

article/2025/7/10 1:21:52

1.ItemCF:

协同过滤是什么?

协同过滤 (Collaborative filtering),指的是,通过收集群体用户的偏好信息,自动化预测(过滤)个体用户可能感兴趣的内容。协同(collaborating)是群体行为,过滤(filtering)则是针对个人的行为。

ItemCF:Item Collaboration Filter,基于物品的协同过滤。

核心思想:itemCF算法通过计算用户的历史行为记录,来分析物品之间的相似度:如果喜欢物品a的用户大多数也喜欢物品b,那么认为物品A与物品B具有一定的相似度。这就很容易为推荐结果做出合理的解释。

算法步骤:

  1. 计算物品之间的相似度;
  2. 根据物品的相似度和用户的历史行为给用户生成推荐列表;

1.计算物品之间的相似度

N(a)和N(b)分别是喜欢物品i和物品i的用户数量,是既喜欢物品a又喜欢物品b的用户数量,那么物品A和物品B的相似度为:

上述公式有个问题:如果B是个很热门的商品,那么将会接近于1(因为喜欢A的人都喜欢B),这会造成任何其他物品与某个热门物品都很相似。因此,我们对公式作一些修改,加上一个惩罚物品B的权重因子,得到了如下公式: 

 2.给用户推荐物品。
        用户u对物品j的兴趣程度:

基本思想:如果要计算用户u与物品j的兴趣度, 先找到与j最相似的k个物品,再看用户u与这些物品的感兴趣程度,加权得到p(u,j): 用户u对物品j的兴趣程度。

举个例子:

    ItemCF流程:
    1、根据用户下单数据计算poi相似度

       CalSim为计算poi相似度的模块,基于论文Scalable Similarity-Based Neighborhood Methods with MapReduce实现。

        CalSim模块:
        Preprocess: 将(user, poi, score)输入转换成 poi,(user, score);(user, score); ...形式,
针对不同相似度度量方法对score进行转换;
        Norm:针对不同相似度度量方法计算poi vector的norm;
        Reverse:将Preprocess中生成的poi,(user, score);(user, score); ...数据,转化成
user,(poi, score);(poi, score); ...的倒排形式,以便Similarity按照user进行数据分块;
        Similarity:组织mapper,combiner & reducer实施相似度计算。

理论部分已经介绍完毕,下面是代码部分:

#-*-coding:utf-8-*-'''
Created on 2016-5-30
@author: thinkgamer
'''
import mathclass ItemBasedCF:def __init__(self,train_file):self.train_file = train_fileself.readData()def readData(self):#读取文件,并生成用户-物品的评分表和测试集self.train = dict()     #用户-物品的评分表for line in open(self.train_file):# user,item,score = line.strip().split(",")user,score,item = line.strip().split(",")self.train.setdefault(user,{})self.train[user][item] = int(float(score))def ItemSimilarity(self):#建立物品-物品的共现矩阵C = dict()  #物品-物品的共现矩阵N = dict()  #物品被多少个不同用户购买for user,items in self.train.items():for i in items.keys():N.setdefault(i,0)N[i] += 1C.setdefault(i,{})for j in items.keys():if i == j : continueC[i].setdefault(j,0)C[i][j] += 1#计算相似度矩阵self.W = dict()for i,related_items in C.items():self.W.setdefault(i,{})for j,cij in related_items.items():self.W[i][j] = cij / (math.sqrt(N[i] * N[j]))return self.W#给用户user推荐,前K个相关用户def Recommend(self,user,K=3,N=10):rank = dict()action_item = self.train[user]     #用户user产生过行为的item和评分for item,score in action_item.items():for j,wj in sorted(self.W[item].items(),key=lambda x:x[1],reverse=True)[0:K]:if j in action_item.keys():continuerank.setdefault(j,0)rank[j] += score * wjreturn dict(sorted(rank.items(),key=lambda x:x[1],reverse=True)[0:N])#声明一个ItemBased推荐的对象    
Item = ItemBasedCF("uid_score_bid")
Item.ItemSimilarity()
recommedDic = Item.Recommend("xiyuweilan")
for k,v in recommedDic.iteritems():print k,"\t",v

2.MF(ALS)矩阵分解

原理和代码可以参考ALS 在 Spark MLlib 中的实现_凝眸伏笔的博客-CSDN博客_spark中的als,这是18年夏天使用该算法的时候,做的笔记,写的略微繁琐,这里精简一下。论文名字:matrix factorization techniques for recommender systems

先放一张图留着:

image.png

MF(matrix factorization):矩阵分解,分解的是什么矩阵,元素如何获取?

       这个矩阵是上图的“Rating”,是user对deal,也就是item的行为,在论文中,Rating是电影评分的意思,在工业界中,这个Rating,可以是user对deal的点击、下单、浏览的汇总,至于汇总的方式是什么,根据你对业务的理解,自己定义。比如user对deal1点击1次算1分,下单算5分,也即是给不同行为加权累积。这里要注意,在使用spark ML中ALS的时候,要注意迭代分解的时候是显示还是隐式,像上述给出的Rating,那便是显示行为,人为的给这个user-deal之间强加了一个rating.

基于矩阵分解的推荐算法的核心假设是用隐语义(隐变量)来表达用户和物品,他们的乘积关系就成为了原始的元素。这种假设之所以成立,是因为我们认为实际的交互数据是由一系列的隐变量的影响下产生的(通常隐变量带有统计分布的假设,就是隐变量之间,或者隐变量和显式变量之间的关系,我们往往认为是由某种分布产生的。),这些隐变量代表了用户和物品一部分共有的特征,在物品身上表现为属性特征,在用户身上表现为偏好特征,只不过这些因子并不具有实际意义,也不一定具有非常好的可解释性,每一个维度也没有确定的标签名字,所以才会叫做 “隐变量”。而矩阵分解后得到的两个包含隐变量的小矩阵,一个代表用户的隐含特征,一个代表物品的隐含特征,矩阵的元素值代表着相应用户或物品对各项隐因子的符合程度,有正面的也有负面的。

ALS 是什么?----同SGD一样,求解参数的一种方法

      ALS 是交替最小二乘 (alternating least squares)的简称。在机器学习的上下文中,ALS 特指使用交替最小二乘求解的一个协同推荐算法。

ALS 的核心就是下面这个假设:打分矩阵是近似低秩的。换句话说,一个m*n的大矩阵 A 可以用两个小矩阵U(m*k)和V(n*k)的乘积来近似:

ALS 的名字里给出——交替最小二乘。ALS 的目标函数不是凸的,而且变量互相耦合在一起,所以它并不算好解。但如果我们把用户特征矩阵U和产品特征矩阵V固定其一,这个问题立刻变成了一个凸的而且可拆分的问题。比如我们固定U,那么目标函数就可以写成。其中关于每个产品特征vj的部分是独立的,也就是说固定U求vj我们只需要最小化就好了,这个问题就是经典的最小二乘问题。所谓“交替”,就是指我们先随机生成U0然后固定它求解V0,在固定V0求解U1,这样交替进行下去。因为每步迭代都会降低重构误差,并且误差是有下界的,所以 ALS 一定会收敛。但由于问题是非凸的,ALS 并不保证会收敛到全局最优解。但在实际应用中,ALS 对初始点不是很敏感,是不是全局最优解造成的影响并不大。

汇总:

        对于一个users-products-rating的评分数据集,ALS会建立一个user*product的m*n的矩阵。其中,m为users的数量,n为products的数量。但是在这个数据集中,并不是每个用户都对每个产品进行过评分,所以这个矩阵往往是稀疏的,用户i对产品j的评分往往是空的。

        ALS所做的事情就是将这个稀疏矩阵通过一定的规律填满,这样就可以从矩阵中得到任意一个user对任意一个product的评分,ALS填充的评分项也称为用户i对产品j的预测得分。所以说,ALS算法的核心就是通过什么样子的规律来填满(预测)这个稀疏矩阵

它是这么做的:假设m*n的评分矩阵R,可以被近似分解成U*(V)T,U为m*d的用户特征向量矩阵,V为n*d的产品特征向量矩阵((V)T代表V的转置),d为user/product的特征值的数量。ALS算法的核心就是将稀疏评分矩阵分解为用户特征向量矩阵和产品特征向量矩阵的乘积交替使用最小二乘法逐步计算用户/产品特征向量,使得差平方和最小通过用户/产品特征向量的矩阵来预测某个用户对某个产品的评分。

spark ALS代码解释

常被应用于推荐系统。这些技术旨在补充用户-商品关联矩阵中所缺失的部分。MLlib当前支持基于模型的协同过滤,其中用户和商品通过一小组隐语义因子进行表达,并且这些因子也用于预测缺失的元素。为此,我们实现了ALS来学习这些隐性语义因子。在 MLlib 中的实现有如下的参数:

numBlocks 是用于并行化计算的分块个数 (设置为-1为自动配置)。

rank 是模型中隐语义因子的个数。就是平时的特征向量的长度。

maxIter:iterations 是迭代的次数。

lambda 是ALS的正则化参数。

implicitPrefs 决定了是用显性反馈ALS的版本还是用适用隐性反馈数据集的版本,如果是隐性反馈则需要将其参数设置为true。

alpha 是一个针对于隐性反馈 ALS 版本的参数,这个参数决定了偏好行为强度的基准。

itemCol:deal的字段名字,需要跟表中的字段名字是一样的。

nonnegative:是否使用非负约束,默认不使用 false。

predictionCol:预测列的名字

ratingCol:评论字段的列名字,要跟表中的数据字段一致。

userCol:用户字段的名字,同样要保持一致。

实践小技巧:
1.调参,推荐使用网格搜索进行调参。

包括三步: 

    println("end als and begin paramGrid ----------")val paramGrid = new ParamGridBuilder().addGrid(als.maxIter,Array(50,100,150)).addGrid(als.rank,Array(32,64,128,256)).build()val evaluator = new RegressionEvaluator().setMetricName("rmse").setLabelCol("rating").setPredictionCol("prediction")println("end evaluator and begin TV ")val trainValidationSplit = new TrainValidationSplit().setEstimator(als).setEvaluator(evaluator).setTrainRatio(0.8).setEstimatorParamMaps(paramGrid).setSeed(567812)println("begin tv model__________")val tvModel: TrainValidationSplitModel = trainValidationSplit.fit(training)

第一步:确定paramGrid。这里加入对迭代次数和分裂维度进行网格搜索。其实就是贪婪搜索,遍历每一种可能。

第二步:确定评估方法evaluator。这里用rmse进行评估。

第三步:TV方法进行训练。

第四步:可能需要模型之间的转换。

2. ALS中还有一个加速分解的参数:

.setNumBlocks(200)

这个参数官网文档说这个参数可以设置为-1,加速分解,但是我将其设置为-1的时候,出bug,说是该参数设置无效。因此只能尽量的将这些参数设置的大一些,加速矩阵分解。我采用了rating矩阵中有5亿数据进行分解,分200块,速度确实提高了不少,具体没有衡量。

3.写在最后,感谢孟祥瑞大佬、铭霏大佬以及各位大佬在als在sparkML中的实现。

参考博客:

1.itemcf: https://blog.csdn.net/dreamfantacy/article/details/102406922

2.https://blog.csdn.net/u012102306/article/details/51097502

3.关于矩阵分解用于推荐系统的博客:基于矩阵分解的推荐算法 | 卢明冬的博客

    补充知识:
        准确率:最终的推荐列表中推荐对了的比率。
        召回率:推荐对了的占全集的比率。


http://chatgpt.dhexx.cn/article/YU6Vxwnv.shtml

相关文章

Git merge时使用--no-ff参数

/1、Git:Git-merge的–ff和–no-ff。 前言 Git merge最容易糊涂的地方就是这个--ff参数和--no-ff 参数,通过本文,把这个整理清楚。 其实官网讲的非常清楚,不过可能因为是英文的,所以大家阅读起来会有一些障碍。&…

如何清除弹窗FF新推荐

前言:一个星期日的下午,我打算过肥宅的生活,吃的东西已经就位,当我打开电脑后跳出了这个玩意,瞬间好心情全无。身为程序员,感觉受到了侮辱。 一 Adobe Flash简介 查看任务管理器查看详细信息如下&#xf…

ff新推荐弹窗怎么彻底删除---解决方案

根源:几乎所有的电脑中都会安装Flash Player,而FF新推荐弹窗就是Flash Player的,那么Win7、Win10系统FF新推荐怎么卸载? 方法一:直接删除FF新推荐 1、如果FF新推荐弹出之后,先不要关闭掉,使用键…

彻底关闭弹出广告“FF新推荐”

很多小伙伴们都发现,近一段时间,自己的电脑中时常会弹出一个叫“FF新推荐”的广告弹窗,扰民不说显示的内容也很猥亵。一检查发现居然是Flash中国官方干的,安装了flash播放器后就弹出广告。就像下面这样的: 1. FF新推荐…

Java课程设计

学生考勤管理系统 文章目录 学生考勤管理系统一、 前言1、设计背景2、系统设计的目的及意义3、 调查用户需求 二、 系统简介三、 功能介绍1、服务器启动2、登陆3、学生端4、 老师端 四、 系统调试实现1、老师端2、学生端 五、 总结 一、 前言 1、设计背景 随着社会的发展&…

软件测试学习路线

软件测试学习路线图 随着互联网IT产业的蓬勃发展,软件测试的行业也日趋火热,更多人的转向了软件测试行业,当然更多的问题也亟待解决,比如软件测试自学教程视频内容?软件测试视频教程?软件测试培训入门教程?软件测试培训学习思路?鉴此千锋教育不惜教育成本,全面推出软…

学习Altium Designer软件总结

广西●河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院: 智控无人机小组 写作时间:2020.08.22 学习Altium Designer软件总结 因学习了AD,在此总结一下步骤和我遇到的问题以及的解决方法。 (1…

软件开发专业主要有哪些课程?

软件开发专业主要有哪些课程? 1、WEB分为前端开发和后端开发,前端开发需要学CSS3、JavaScript、Html5,后端开发开发需要学PHP、Python、Java。 2、移动端开发需要学OC或者Swift。 3、嵌入式开发需要学C语言、计算机基础知识等。 软件分为系统…

专业工具软件课程学习心得

专业工具软件课程学习心得 部分资源链接: 1 http://download.csdn.net/detail/zhangrelay/9799032 2 http://download.csdn.net/detail/zhangrelay/9799055 3 http://pan.baidu.com/s/1hs1IRMO 密码: kqiz …… 课程学习需要结合其他理论课程&am…

云原生学习的最佳路径

前言 运维这个课程是一个入行门槛低,精通比较难的岗位。 之所以比较难精通,是因为学的比较杂。更重要的是很多种知识并没有一个很好的连贯性。 比如你学zabbix和学docker,就是在学两个东西。 在或者你学nginx和学mysql,这也是两…

课程设计 英语学习助手

课程设计–英语学习助手 1.具体实现的功能模块 试设计一个英语学习助手,下列各项为对该系统数据库的基本要求。 (1)实现英语单词的录入、修改、删除等基本操作; (2)实现常用英语单词例句的录入、修改、删除…

电子科技大学软件工程大一到大三课程

大三下 实习6个月 大三上 大二下 大二上 大一下 大一上

计算机软件要学哪些课程,计算机软件专业主要学习哪些课程?

当前很多中专、大专类职业院校都开设了计算机软件专业。很多同学在选择该专业时,想知道这个专业有哪些课程,这些课程学习难度如何等问题。下面成都职业学校的老师就给大家解答。 首先看主要课程:中专类学习开设的主要课程有:动画设…

NB-IoT 的低功耗分析,我们是怎么做的

人与人之间的通讯规模已近天花板,物与物(IoT)的则刚刚进入增长快车道。随着可穿戴、车联网、智能手表等新兴市场的开启,工业4.0、智慧城市、智慧农业等理念照进现实,万物互联的时代正加速到来。预计未来全球物联网连接…

NB-IOT实验练习2——STM32基础实验

STM32基础实验 上一节介绍了江苏学蠡信息科技有限公司的无线传感器网络实验平台关于NB-IOT实验所需要的各项硬件以及所需要的软件组成部分,这一章,主要是使用STM32F103单片机的基础实验进行介绍和演示。 1. 使用STM32CubeMX创建工程 STM32的开发目前一…

涂鸦NBIOT OpenCPU开发快速入门(一)

今天我作为涂鸦的固件开发者的身份为大家详细讲解NB模组在涂鸦平台的快速对接。基于涂鸦完善的蜂窝通讯机制,使用涂鸦的OpenCPU SDK,可以实现真正的产品级对接!用户只需要关注业务实现,无需过度关注底层基线逻辑以及物联网通讯流程…

nb-iot_IoT项目:Arduino使用Parse.com的Temboo向Android发送推送通知

nb-iot 这篇文章介绍了如何创建一个IoT项目,该项目使用Arduino通过Temboo和Parse.com将推送消息发送到Android智能手机。 例如,我们将构建一个基于Arduino和Android的警报系统,这是一个有趣的物联网(IoT)示例,该项目的目的是使用连…

NBIOT连接阿里云控制台(MQTT连接阿里云控制台)

首先使用MQTT工具连接阿里云平台进行测试之后再使用NBIOT连接控制台,这里主要讲解MQTT连接阿里云的步骤 1、注册或登录阿里云账号 自行前往阿里云官网注册 2、进入物联网界面 首先点击阿里云旁边1位置的选项进入如下界面,找到物联网IOt里面的物联网平…

NB-IoT 接入 5G 核心网丨边缘计算阅读周

#边缘计算阅读周# 读书的人,有梦可做。 边缘计算社区联合6大出版社邀您一起阅读,一起做追梦人。 在近日结束的ITU-R WP5D#35会议上,3GPP技术正式被接受为ITU IMT-2020 5G技术标准。 此次通过的3GPP技术包含中国提交的3GPP NR NB-IoT RIT&am…

NB-IOT开发实战

一,初识NB-IOT 1,NB-IOT介绍 NB ----Narrow BandIOT —Internet of thingsNB-IOT —窄带物联网 2,物联网发展 广/深覆盖:比GPRS覆盖增强20dB 低功耗:基于AA电池,使用寿命可超过10年 低成本:…