[machine Learning]推荐系统

news2024/9/30 15:19:22

其实严格来说推荐系统也是一种监督学习,我们需要根据已有数据进行预测,但是这种训练数据不是单纯的输入和输出问题,所以被归类为"超越监督学习"的一种?

今天去旁听了隔壁专业的机器学习课程,感觉自己的知识确实不是很系统,所以后面会找个机会把前面的代码给补充上.

下面将会介绍两种推荐系统还有一些我了解到的计算细节,以一个电影推荐为具体的案例,可能不够详细,还请多多担待啦

1.协同过滤算法:

协同过滤算法的内容很多,所以这里我们先不直接将协同过滤的情况,我们先拟定一个情景,加入我们正在做一个电影推荐网站,我们需要给一些用户推荐电影(说白了就是这个用户可能没看过这个电影,但是我们可以根据这个用户的其他相关数据和电影相关的数据来推断用户可能会给这个电影打上多少分数,从而确定要不要给这个用户推荐这个电影)

我们从头开始讲起,最后再告诉你为什么这东西叫协同过滤,而不是简简单单的监督学习

首先我们认为,用户的打分是基于这个公式

y=\omega _{j}*x_{i} +b_{i}

w,b代表了用户的喜好权重和偏好,而x则代表某个电影的特征数值

(1)假设已知电影的特征

然后我们有如下的一些数据

可以看到这张图里我们通过某种手段知道了电影的特征数值,比如这个电影是不是动作片,这个电影是不是浪漫电影,并且我们可以看到一些用户一些电影的打分.

我们需要预测某个用户对这个电影会打上多少分数,就必须直到整个用户的喜好,也就是我们要训练出一个合适的w和b.万幸的是,再这种图中,我们可以看到这个用户对其他电影有一些评价,我们就可以使用机器学习的手段预测出一个合适的w和b,最后再带入想要预测的电影的特征值x,就能得到用户对这个电影可能的打分.

代价函数为:(假设j为用户,i为电影)

J(w_{j},b_{j})=\frac{1}{2}\sum_{i:y(i,j)\neq 0}^{m_{movie}}(w_{j}*x_{i}+b_{j}-y(i,j))^{2} + \frac{\lambda }{2}\sum_{k=1}^{n}(w_{j}^{(k)})^{2}

训练出某个用户的喜好,就要用该用户看过的所有电影的特征值训练,最后对权重进行惩罚

最后得到代价最小的w和b,就可以用来估算用户的喜好了

如果是想要一次性对所有用户的喜好都进行计算,也是可行的

J(w_{j},b_{j})=\frac{1}{2}\sum_{j}^{m_{user}}\sum_{i:y(i,j)\neq 0}^{m_{movie}}(w_{j}*x_{i}+b_{j}-y(i,j))^{2} + \frac{\lambda }{2}\sum_{j}^{m_{user}}\sum_{k=1}^{n}(w_{j}^{(k)})^{2}

(2)已知用户的一些喜好

我们可以换个角度想一想,有时候上线了一部新电影,但是我们的员工没有足够的时间去看这个部电影,但是很多老客户已经打完分了,我们可以从这些了解过的老用户的打分,来推断出这个可能是什么电影.

这个时候的意思就是,我们知道很多用户的w和b,以及打分y,但是不知道某部电影的特征x.

 比如这张图的情况,我们只知道打分y,以及通过某种手段知道了用户的一些特征

我们就可以用类似上面的方法计算出可能的特征值

同样的,我们直接上代价函数

J(x_{i})=\frac{1}{2}\sum_{j:y(i,j)\neq 0}^{m_{user}}(w_{j}*x_{i}+b_{j}-y(i,j))^{2} + \frac{\lambda }{2}\sum_{k=1}^{n}(x_{i}^{(k)})^{2}

这个代价函数的意义就算根据所有看过这部电影的用户的打分,喜好,来判断和训练出这部电影可能的分值.

同样的,如果想要一次性囊括所有电影的代价,可以再原本的基础上加上全部的电影

J(x_{i})=\frac{1}{2}\sum_{i}^{m_{movie}}\sum_{j:y(i,j)\neq 0}^{m_{user}}(w_{j}*x_{i}+b_{j}-y(i,j))^{2} + \frac{\lambda }{2}\sum_{i}^{m_{movie}}\sum_{k=1}^{n}(x_{i}^{(k)})^{2}

这样就可以计算出电影特征值了

(3)协同过滤算法是怎么做的

这个时候你可能会问,这不就是很简单神经网络拟合吗,为什么要叫协同过滤

其实是因为第三种情况,如果我们的员工今天出去吃麦乐鸡,回来一看很多不知底细的新用户已经对新上线的电影打完分了,这个时候该怎么做推荐?就算是分开按照步骤做,我们不知道用户的喜好wb,也不知道电影的特征x,只知道用户的打分(很大概率打分都不全),然而我们仍然想要做一些推荐

答案就是综合以上两种情况,直接使用用户打分来预测其他的打分,也就是说我们要同时获取的数据是w,b,x.

还记得我们之前分别尝试过整体训练所有人的喜好和所有电影的特征,这个式子组合起来是这样的

J(x_{i})=\frac{1}{2}\sum_{i}^{m_{movie}}\sum_{j:y(i,j)\neq 0}^{m_{user}}(w_{j}*x_{i}+b_{j}-y(i,j))^{2} + \frac{\lambda }{2}\sum_{i}^{m_{movie}}\sum_{k=1}^{n}(x_{i}^{(k)})^{2}+ \frac{\lambda }{2}\sum_{j}^{m_{user}}\sum_{k=1}^{n}(w_{j}^{(k)})^{2}

直接把两个综合代价函数组合起来得到最终的结果.

然后具体的梯度下降操作的时候,对每个用户的喜好,每个电影的特征都要做gradient descent

repeat \{\\ \\w_{1}=w_{1}-\frac{\theta }{\theta w_{1}}J(w,b,x), \\................... \\w_{j}=w_{j}-\frac{\theta }{\theta w_{j}}J(w,b,x),\\\\ \\b_{1}=b_{1}-\frac{\theta }{\theta b_{1}}J(w,b,x) \\................... \\b_{j}=b_{j}-\frac{\theta }{\theta b_{j}}J(w,b,x),\\\\ \\x_{1}=x_{1}-\frac{\theta }{\theta x_{1}}J(w,b,x) \\................... \\x_{i}=x_{i}-\frac{\theta }{\theta x_{i}}J(w,b,x),\\ \\\}

这就是整体梯度下降的方法,最终合适的迭代结果可以用来估计出某个用户的某个电影的评分

(4)均值归一化

有些时候我们会碰到这样一个情况,一个纯纯的新电影,或者一个纯纯的新用户在我们的数据里面,我们仍然要想办法给他实现一些推荐.其实空白数据强行训练完全可行,但是可能数据不是很理想

其实我们的基本思想是想办法按照大家的平均值,给他来个预测打分,实际实现有点这个意思,但是不多

首先我们计算出对各个电影,看过的用户打分的平均值

然后,矩阵中原有的数据全部减去对应的平均值

则接下来的,用户对于某个电影的估计评分,要再把平均值加回来

 

剩下的代价函数计算一致,这种方法叫做均值归一化,避免了因为某个极端数据或者空白数据导致推荐效果出现很大偏差

2.基于内容的推荐算法 

上面我们提到的情况是协同过滤算法,其实再本质上是基于相似度,比如用户可能有些特征上的相似度(相似度使用范式2计算,这里不细细解释了)

而在基于内容过滤中,如果我们想要推荐一个显影,我们需要检测的是用户和电影的匹配程度,best match.

由于这个没有计算和理解上的难度,所以我们直接将具体的算法推荐出来

假设我们还是做点听推荐,与之不同的是这次我们知道用户的喜好和电影的特征,我们可以根据数据对来进行训练

((w,b,x),y)这样的数据,结合两个神经网络最终得到合适的一个训练模型,接下来就可以根据这个模型判断最终的计算结果,得到用户的可能打分

我们首先把用户特征和电影特征转化为另一种统一的形式,使用向量v来表示

然后这两个直接相乘,就是我们的预测分数 y

接下来根据训练数据,训练这个模型即可

3.大型目录系统的推荐 

基于上面的内容过滤算法,我们可以检查用户和电影的匹配程度

但是有个问题,一个成熟的流媒体可能会产生大量的电影或者上百万的商品,进行匹配度深度网络计算,然后再排序放出来,无疑是很大的消耗,所以在一般的大型推荐系统中,我们走的是retrieve和rank两个步骤

(1)retrieve 获取一个初步的list,包含了用户可能喜欢的部分

比如从用户最近看过的10部电影,在寻找十个相似的电影

本地区的用户看到的前10个电影,或者说是每个系列最高的十部电影

(2)rank,计算用户和这个list的匹配程度,然后进行排序推荐即可

这样就避免了对于整体的排序推荐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【肝素··】

Recent advances in the management of venous thromboembolism Korean J Hematol 2010;45:8-13 Serpin Structure, Mechanism, and Function-2002 糖胺聚糖 凝血 Fibrinolysis | Detailed Pedia

2023百度云智大会:科技与创新的交汇点

​ 这次的百度云智大会,可谓是亮点云集—— 发布了包含42个大模型、41个数据集、10个精选应用范式的全新升级千帆大模型平台2.0,发布首个大模型生态伙伴计划,而且也预告了文心大模型4.0的发布,大模型服务的成绩单也非常秀&#x…

文件重命名不再繁琐:MetaRename for Mac帮你简化重命名流程

文件重命名是我们在日常使用电脑时经常需要进行的一项任务。但是,有时候我们需要批量重命名文件,并且希望在新文件名中添加一些特定的信息,比如日期、时间、序号等。这时候,使用MetaRename for Mac可以帮助你轻松完成任务。 Meta…

手写Spring:第7章-实现应用上下文

文章目录 一、目标:实现应用上下文二、设计:实现应用上下文三、实现:实现应用上下文3.1 工程结构3.2 Spring应用上下文和Bean对象扩展类图3.3 对象工厂和对象扩展接口3.3.1 对象工厂扩展接口3.3.2 对象扩展接口 3.4 定义应用上下文3.4.1 定义…

Python数据分析实战-将dataframe某列的值分成不同区间并计算每个区间的频数(附源码和实现效果)

实现功能 将dataframe某列的值分成不同区间并计算每个区间的频数 实现代码 import pandas as pd# 创建dataframe data {Name:[Tom1, Jack1, Steve1, Ricky1, Tom2, Jack2, Steve2, Ricky2],Score:[78,60,59,42,88,34,69,142]} df pd.DataFrame(data) print(df)# 定义区间和…

Linux 部署1Panel现代化运维管理面板远程访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、…

el-form表单动态校验(场景: 输入框根据单选项来动态校验表单 没有选中的选项就不用校验)

el-form表单动态校验 el-form常规校验方式: // 结构部分 <el-form ref"form" :model"form" :rules"rules"><el-form-item label"活动名称: " prop"name" required><el-input v-model"form.name" /…

【网络通信 -- WebRTC】FlexFec 基本知识点总结概述

【网络通信 -- WebRTC】FlexFec 基本知识点总结概述 【1】FlexFec 的保护方案 假设存在一组源数据包(D L)&#xff0c;其序列号从 1 开始运行到 D L 一维非交错行 FEC(1-D Non-interleaved Row FEC) : 一种连续的源数据包进行保护的方案&#xff0c;可用于恢复按行分组的源…

用Pycharm开发Flask框架设置debug模式、port 端口和 host 主机无效的解决办法

方法二 &#xff08;推荐&#xff09; Name 的选择请自行填写&#xff0c;随意。 这里笔者就默认 app 注意事项 需要以这个作为启动项&#xff0c;而不是原来的 flask 启动配置文件。 参考链接 1. 用Pycharm开发Flask框架设置debug模式没有效果的解决办法 2. flask中的de…

项目管理流程文件,招标支撑文件,项目研发,验收等系列支撑文件

写在前面&#xff1a; 我花了一些时间整理了这些年从事软件行业以来的文档&#xff0c;将它们分类整理后&#xff0c;电脑瞬间变得更加简洁。我整理了数百份软件开发过程中的常用文档&#xff0c;包括项目计划、立项计划、需求分析、概要设计、详细设计、数据库设计、用户操作手…

盘点3款超好用的免费录屏软件,快来看!

在现代数字化社会中&#xff0c;录屏软件成为了各行各业中必备的工具之一&#xff0c;用于记录操作步骤、制作教程、分享游戏精彩瞬间等。而寻找一款免费的、功能强大的录屏软件也变得越来越重要。本文将为您介绍3款免费录屏软件&#xff0c;并详细说明使用步骤&#xff0c;帮助…

C语言是否快被时代所淘汰?

今日话题&#xff0c;C语言是否快被时代所淘汰&#xff1f;在移动互联网的冲击下&#xff0c;windows做的人越来越少&#xff0c;WP阵营没人做&#xff0c;后台简单的php&#xff0c;复杂的大数据处理的java&#xff0c;要求性能的c。主流一二线公司基本上没多少用C#的了。其实…

K8S:kubeadm搭建K8S+Harbor 私有仓库

文章目录 一.部署规划1.主机规划2.部署流程 二.kubeadm搭建K8S1.环境准备2.安装docker3. 安装kubeadm&#xff0c;kubelet和kubectl4.部署K8S集群&#xff08;1&#xff09;初始化&#xff08;2&#xff09;部署网络插件flannel&#xff08;3&#xff09;创建 pod 资源 5.部署 …

pikachu——一、暴力破解模块通关教程

pikachu 一、靶场介绍二、Burte Force&#xff08;暴力破解&#xff09;概述三、基于表单的暴力破解四、验证码绕过&#xff08;on client&#xff09;五、验证码绕过&#xff08;on server&#xff09;六、token防爆破&#xff1f; 一、靶场介绍 靶场搭建&#xff1a; https:…

OpenShift 4 - 在 OpenShift Virtualization 上自动部署 OpenShift 托管集群(演示视频)

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 OpenShift 4.12 OpenShift Virtualization 4.12 ACM 2.8 的环境中验证 文章目录 技术架构安装配置环境环境要求安装配置 OpenShift Virtualization安装配置 Red Hat ACM安装配置 MetalLB在 OpenShift …

无涯教程-JavaScript - DEC2HEX函数

描述 DEC2HEX函数将十进制数转换为十六进制。 语法 DEC2HEX (number, [places])争论 Argument描述Required/Optionalnumber 要转换的十进制整数。 如果number为负数,则将忽略位数,并且DEC2HEX返回10个字符(40位)的十六进制数字,其中最高有效位是符号位。其余的39位是幅度位…

24.绳子切割

目录 题目 Description Input Output 思路 注意事项 C完整代码 题目 Description 有N条绳子&#xff0c;它们的长度分别为Li&#xff0c;Li都是正整数。如果从它们中切割出K条长度相同的绳子&#xff08;绳子的长度为整数&#xff09;&#xff0c;这K条绳子每条最长能有…

照片怎么进行压缩?这几个压缩方法分享给你

照片怎么进行压缩&#xff1f;在如今这个时代&#xff0c;我们经常需要共享照片。但是&#xff0c;一些高像素的照片可能会占用大量存储空间&#xff0c;甚至可能无法通过电子邮件或社交媒体进行共享。因此&#xff0c;我们需要对照片进行压缩&#xff0c;以减小文件的大小并方…

互联网医院App开发:构建医疗服务的技术指南

互联网医院App的开发是一个复杂而具有挑战性的任务&#xff0c;但它也是一个充满潜力的领域&#xff0c;可以为患者和医疗专业人员提供更便捷的医疗服务。本文将引导您通过一些常见的技术步骤来构建一个简单的互联网医院App原型&#xff0c;以了解该过程的基本概念。 技术栈选…

A133P EC200M模块调试

Linux USB驱动框架&#xff1a; USB 是一种分层总线结构。USB 设备与主机之间的数据传输由 USB 控制器控制。Linux USB 驱动程序架构如下图所示。Linux USB 主机驱动包括三部分&#xff1a;USB 主机控制器驱动、USB 核心和 USB 设备驱动。 模块加载 USB 转串口 option 驱动程序…