FM算法解析及Python实现

2023-11-03

1. 什么是FM?

FM即Factorization Machine,因子分解机。

2. 为什么需要FM?

1、特征组合是许多机器学习建模过程中遇到的问题,如果对特征直接建模,很有可能会忽略掉特征与特征之间的关联信息,因此,可以通过构建新的交叉特征这一特征组合方式提高模型的效果。

2、高维的稀疏矩阵是实际工程中常见的问题,并直接会导致计算量过大,特征权值更新缓慢。试想一个10000100的表,每一列都有8种元素,经过one-hot独热编码之后,会产生一个10000800的表。因此表中每行元素只有100个值为1,700个值为0。

而FM的优势就在于对这两方面问题的处理。首先是特征组合,通过对两两特征组合,引入交叉项特征,提高模型得分;其次是高维灾难,通过引入隐向量(对参数矩阵进行矩阵分解),完成对特征的参数估计。

3、 FM用在哪?

我们已经知道了FM可以解决特征组合以及高维稀疏矩阵问题,而实际业务场景中,电商、豆瓣等推荐系统的场景是使用最广的领域,打个比方,小王只在豆瓣上浏览过20部电影,而豆瓣上面有20000部电影,如果构建一个基于小王的电影矩阵,毫无疑问,里面将有199980个元素全为0。而类似于这样的问题就可以通过FM来解决。

4、 FM长什么样?

在展示FM算法前,我们先回顾一下最常见的线性表达式:
在这里插入图片描述
其中w0 为初始权值,或者理解为偏置项,wi 为每个特征xi 对应的权值。可以看到,这种线性表达式只描述了每个特征与输出的关系。

FM的表达式如下,可观察到,只是在线性表达式后面加入了新的交叉项特征及对应的权值。
在这里插入图片描述

5、 FM交叉项的展开

5.1 寻找交叉项

FM表达式的求解核心在于对交叉项的求解。下面是很多人用来求解交叉项的展开式,对于第一次接触FM算法的人来说可能会有疑惑,不知道公式怎么展开的,接下来手动推导一遍。
在这里插入图片描述
上面式子第一步推导如下:

在这里插入图片描述
设有3个变量(特征)x1 x2 x3,每一个特征的隐变量分别为v1=(1 2 3)、v2=(4 5 6)、v3=(1 2 1),即:
在这里插入图片描述
所以:
在这里插入图片描述
实际上,我们应该考虑的交叉项应该是排除自身组合的项,即对于x1x1、x2x2、x3x3不认为是交叉项,那么真正的交叉项为x1x2、x1x3、x2x1、x2x3、x3x1、x3x2。
去重后,交叉项即x1x2、x1x3、x2x3。这也是公式中1/2出现的原因。

5.2 交叉项权值转换

对交叉项有了基本了解后,下面将进行公式的分解,还是以n=3为例,
在这里插入图片描述
所以:
在这里插入图片描述
wij可记作(ViVjT)或(viTvj),这取决于vi是13 还是31 向量。

5.3 交叉项展开式

上面的例子是对3个特征做的交叉项推导,因此对具有n个特征,FM的交叉项公式就可推广为:
在这里插入图片描述
我们还可以进一步分解:
在这里插入图片描述
所以FM算法的交叉项最终可展开为:

在这里插入图片描述

5.4 隐向量v就是embedding vector?

假设训练数据集dataMatrix的shape为(20000,9),取其中一行数据作为一条样本i,那么样本i 的shape为(1,9),同时假设隐向量vi的shape为(9,8)(注:8为自定义值,代表embedding vector的长度)

所以5.3小节中的交叉项可以表示为:

sum((inter_1)^2 - (inter_2)^2)/2

其中:

inter_1 = i*v shape为(1,8)

inter_2 = np.multiply(i)*np.multiply(v) shape为(1,8)

可以看到,样本i 经过交叉项中的计算后,得到向量shape为(1,8)的inter_1和 inter_2。

由于维度变低,所以此计算过程可以近似认为在交叉项中对样本i 进行了embedding vector转换。

故,我们需要对之前的理解进行修正:

  • 我们口中的隐向量vi实际上是一个向量组,其形状为(输入特征One-hot后的长度,自定义长度);
  • 隐向量vi代表的并不是embedding vector,而是在对输入进行embedding vector的向量组,也可理解为是一个权矩阵;
  • 由输入i*vi得到的向量才是真正的embedding vector。

具体可以结合第7节点的代码实现进行理解。

6、 权值求解

利用梯度下降法,通过求损失函数对特征(输入项)的导数计算出梯度,从而更新权值。设m为样本个数,θ为权值。

如果是回归问题,损失函数一般是均方误差(MSE):

在这里插入图片描述
所以回归问题的损失函数对权值的梯度(导数)为:

在这里插入图片描述
如果是二分类问题,损失函数一般是logit loss:

在这里插入图片描述
其中,表示的是阶跃函数Sigmoid。

在这里插入图片描述
所以分类问题的损失函数对权值的梯度(导数)为:
在这里插入图片描述
相应的,对于常数项、一次项、交叉项的导数分别为:

在这里插入图片描述

7、FM算法的Python实现

FM算法的Python实现流程图如下:

在这里插入图片描述

我们需要注意以下四点:

  1. 初始化参数,包括对偏置项权值w0、一次项权值w以及交叉项辅助向量的初始化;

  2. 定义FM算法;

  3. 损失函数梯度的定义;

  4. 利用梯度下降更新参数。

下面的代码片段是以上四点的描述,其中的loss并不是二分类的损失loss,而是分类loss的梯度中的一部分:

loss = self.sigmoid(classLabels[x] * p[0, 0]) -1

实际上,二分类的损失loss的梯度可以表示为:

gradient = (self.sigmoid(classLabels[x] * p[0, 0]) -1)*classLabels[x]*p_derivative

其中 p_derivative 代表常数项、一次项、交叉项的导数(详见本文第6小节)。

FM算法代码片段

 		   # 初始化参数
 2         w = zeros((n, 1))  # 其中n是特征的个数
 3         w_0 = 0.
 4         v = normalvariate(0, 0.2) * ones((n, k))
 5         for it in range(self.iter): # 迭代次数
 6             # 对每一个样本,优化
 7             for x in range(m):
 8                 # 这边注意一个数学知识:对应点积的地方通常会有sum,对应位置积的地方通常都没有,详细参见矩阵运算规则,本处计算逻辑在:http://blog.csdn.net/google19890102/article/details/45532745
 9                 # xi·vi,xi与vi的矩阵点积
10                 inter_1 = dataMatrix[x] * v
11                 # xi与xi的对应位置乘积   与   xi^2与vi^2对应位置的乘积    的点积
12                 inter_2 = multiply(dataMatrix[x], dataMatrix[x]) * multiply(v, v)  # multiply对应元素相乘
13                 # 完成交叉项,xi*vi*xi*vi - xi^2*vi^2
14                 interaction = sum(multiply(inter_1, inter_1) - inter_2) / 2.
15                 # 计算预测的输出
16                 p = w_0 + dataMatrix[x] * w + interaction
17                 print('classLabels[x]:',classLabels[x])
18                 print('预测的输出p:', p)
19                 # 计算sigmoid(y*pred_y)-1准确的说不是loss,原作者这边理解的有问题,只是作为更新w的中间参数,这边算出来的是越大越好,而下面却用了梯度下降而不是梯度上升的算法在
20                 loss = self.sigmoid(classLabels[x] 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FM算法解析及Python实现 的相关文章

  • 协同过滤(Collaborative Filtering):UserCF and Item CF

    具体的学习资料可以参考王喆老师的 深度学习推荐系统 已经梳理好了知识体系 我也将按照这个路线再次梳理一遍 同时做一些拓展和加深理解 一 前言 系统过滤曾是多年前推荐系统领域的应用最广泛的模型 也是基石一样的存在 重要 重要 这里推出两篇论文
  • 推荐系统-基于物品的协同过滤(Item-based CF)

    今天我们来聊一聊基于物品的协同过滤即Item based CF方法 有了上一篇的经验 你可能很容易就想到Item based CF就是通过计算物品之间的相似度 然后用户曾与那些商品发生过交互 给他推荐与这些商品最接近的东西给他 这样做有什么
  • 基于python大数据的电影可视化分析及电影推荐

    随着信息技术和互联网技术的快速发展 利用数据采集技术实现用户感兴趣的数据收集分析成为很多互联网公司研究讨论的热门话题 通过对基于Python的大数据的电影可视化分析与电影推荐 采集进行电影热度动态变化的需求进行调查分析 发现作为研究电影热度
  • 阿里手淘猜你喜欢Swing算法介绍

    Swing算法原理比较简单 是阿里早期使用到的一种召回算法 在阿里多个业务被验证过非常有效的一种召回方式 它认为 user item user 的结构比 itemCF 的单边结构更稳定 Swing指的是秋千 例如用户 u uu 和用户 v
  • 推荐系统系列——推荐算法评价指标

    文章目录 同步读书之 菜根谭 9 静坐观心 真妄毕现 10 得意早回头 拂心莫停手 推荐算法评价指标 1 评分预测指标 1 1 符号定义 1 2 平均绝对误差 1 3 均方根误差 1 4 覆盖率 2 集合推荐指标 2 1 混淆矩阵 2 2
  • 推荐一款优秀电商开源项目

    简介 本文给大家推荐博主自己开源的电商项目newbee mall pro 在newbee mall项目的基础上搭建而来 使用 mybatis plus 作为 orm 层框架 并添加了一系列高级功能以及代码优化 特性如下 商城首页 为你推荐
  • 什么是Embedding?

    说起 Embedding 我想你肯定不会陌生 至少经常听说 事实上 Embedding 技术不仅名气大 而且用 Embedding 方法进行相似物品推荐 几乎成了业界最流行的做法 无论是国外的 Facebook Airbnb 还是在国内的阿
  • Pytorch中的torch.nn.Linear()方法的详解

    torch nn Linear 作为深度学习中最简单的线性变换方法 其主要作用是对输入数据应用线性转换 先来看一下官方的解释及介绍 class Linear Module r Applies a linear transformation
  • 【xgboost】贝叶斯自动调参代码

    工作中 很多场景下会用到xgboost模型 如风控 催收 营销 推荐等待 在用xgboost模型进行模型训练的时候 也经常用贝叶斯自动调参来搜索最优的参数 现在把相关的代码贴出来 供大家参考 目前是支持了xgboost和lightgbm模型
  • 推荐算法:基于内容的推荐_1:内容推荐算法

    基于内容的推荐 推荐给用户他们过去喜欢的类似产品 基于CF的推荐 识别出具有相同爱好的用户 给他们推产品 基于内容的推荐算法 基于内容推荐的步骤 对数据内容分析 得到物品的结构化描述 分析用户过去的评分或评论过的物品的 作为用户的训练样本
  • 个人总结:推荐算法篇(附协同过滤等) 综述

    现代推荐系统 对于在线部分来说 一般要经历几个阶段 首先通过召回环节 将给用户推荐的物品降到千以下规模 因为在具备一定规模的公司里 是百万到千万级别 甚至上亿 所以对于每一个用户 如果对于千万级别物品都使用先进的模型挨个进行排序打分 明显速
  • 基于Mahout实现协同过滤推荐算法的电影推荐系统

    1 Mahout介绍 Apache Mahout 是 Apache Software Foundation ASF 旗下的一个开源项目 提供一些可扩展的机器学习领域经典算法的实现 旨在帮助开发人员更加方便快捷地创建智能应用程序 经典算法包括
  • 图文并茂:推荐算法架构——粗排

    导语 粗排是介于召回和精排之间的一个模块 是典型的精度与性能之间trade off的产物 理解粗排各技术细节 一定要时刻把精度和性能放在心中 本篇将深入重排这个模块进行阐述 一 总体架构 粗排是介于召回和精排之间的一个模块 它从召回获取上万
  • 【干货】今日头条的新闻推荐算法原理

    信息越来越海量 用户获取信息越来越茫然 而推荐算法则能有助于更好的匹配海量内容和用户需求 使之更加的 有的放矢 为让产业各方更好的了解算法分发的相关技术和原理 我们特整理了当下最具影响力的平台的相关干货 和各方分享 本期微信 我们将推荐影视
  • 基于协同过滤推荐+余弦相似度算法实现新闻推荐系统

    针对海量的新闻资讯数据 如何快速的根据用户的检索需要 完成符合用户阅读需求的新闻资讯推荐 本篇文章主要采用余弦相似度及基于用户协同过滤算法实现新闻推荐 通过余弦相似度算法完成针对不同新闻数据之间的相似性计算 实现分类标签 通过协同过滤算法发
  • 京东搜索EE链路演进

    导读 搜索系统中容易存在头部效应 中长尾的优质商品较难获得充分的展示机会 如何破除系统的马太效应 提升展示结果的丰富性与多样性 助力中长尾商品成长是电商平台搜索系统的一个重要课题 其中 搜索EE系统在保持排序结果基本稳定的基础上 通过将优质
  • 毕业设计-基于大数据招聘岗位可视化系统-python

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • 图书推荐管理系统Python,基于Django和协同过滤算法等实现

    一 介绍 图书推荐系统 图书管理系统 以Python作为开发语言 基于Django实现 使用协同过滤算法实现对登录用户的图书推荐 二 效果展示 三 演示视频 视频 代码 https www yuque com ziwu yygu3z gq5
  • 模拟实现 队列 - JAVA(使用链表,数组)

    以链表实现 以数组实现 以链表实现 class Node public int val public Node next public Node int val this val val public class MyQueue publi
  • 【推荐算法】双塔模型代码(tensorflow)

    推荐算法 双塔模型介绍 MachineCYL的博客 CSDN博客 上文介绍了双塔模型的原理和结构 这篇介绍一下双塔模型的代码实现 我使用的是tensorflow来实现双塔模型和模型训练 一 前期准备 tensorflow使用的版本是2 0

随机推荐

  • 现有一个01串s,找出一个最长的连续子串。

    描述 如果一个01串任意两个相邻位置的字符都是不一样的我们就叫这个01串为交错01串 例如 1 10101 0101010 都是交错01串 现有一个01串s 找出一个最长的连续子串 并且这个字串是一个交错01串 求出最长的这样的子串的长度是
  • 华为CE6865交换机远程抓包

    一 背景 由于数据中心使用了VXLAN技术 导致在三层网络中查看不到原始的MAC数据帧 另外一个局限就是所有网络设备都不在本地 所以无法使用镜像技术进行抓包 最后决定使用交换机自带的抓包工具进行远程抓包 把抓包后的文件先保存在交换机上 然后
  • angularJS 报错: [ngModel:numfmt] http://errors.angularjs.org/1.4.1/ngModel/numfmt?p0=333

    pre stringToNumber2 指令中这么写没问题 但是html中调用也这么写 html解析会自动将标签和标签属性专为小写 即stringToNumber2变成了stringtonumber2 导致最终 Error ngModel
  • PandoraBox 端口映射设置

    http www right com cn forum forum php mod viewthread tid 161104
  • 【算法图解】散列表

    一 引入 如果我们需要查找一门课的学分 如 计算机算法设计与分析 简称 算法 这门课 如果教务做得很烂 所有课程都不是按照一定的顺序排列的 那么我们需要浏览每一行直到找到这门课 这将耗费我们O n 的时间 而如果教务系统的学分排序是按照汉语
  • 三年工作经验和月薪16k的java程序员应该如何学习框架源码?

    不管对于哪个段位的程序员来说 读源码都是一件好处颇多的事情 特别于初学者而言 这能迅速的吸纳优秀框架精华代码营养 迅速成长 不巧的是 晦涩难懂的源码 很容易让人心生怯意 今天分享一下读源码的方法 一 了解框架解决了什么问题 这不光对读源码有
  • 米勒电容和米勒效应

    转载 不好意思 时间太久远了 特此注明为转载 之前我们在介绍MOS和IGBT的文章中也有提到米勒电容和米勒效应的概念 在IGBT的导通过程分析的文章中我们也简单提到过米勒平台 下面我们来详细地聊一聊 米勒电容 上图是我们之前在讲MOS和IG
  • linux内存面试题,面试题 +答案

    1 谈谈你对面向对象编程的认识 京东 面向对象编程注重的是 1 数据和其行为的打包封装 2 程序的接口和实现的解耦 2 数据库1中存放着a类数据 数据库2中存放着以天为单位划分的表30张 比如table 20110909 table 201
  • uniapp input自动聚焦

    input标签有一个属性focus 获取焦点 默认值false
  • [论文阅读] (11)ACE算法和暗通道先验图像去雾算法(Rizzi

    娜璋带你读论文 系列主要是督促自己阅读优秀论文及听取学术讲座 并分享给大家 希望您喜欢 由于作者的英文水平和学术能力不高 需要不断提升 所以还请大家批评指正 非常欢迎大家给我留言评论 学术路上期待与您前行 加油 前一篇文章详细介绍和总结基于
  • k8s 集群部署问题整理

    对kubernetes感兴趣的可以加群885763297 一起玩转kubernetes 1 hostname master could not be reached 在host中没有加解析 2 curl sSL http localhost
  • MyBatis中-转义-循环-判断-返回

    官方中文文档地址 http www mybatis org mybatis 3 zh getting started html 1 在Mybatis mapping xml映射配置文件中使用大于 gt 号小于号 lt XML文件会在解析XM
  • Linux 串口RS232/485/GPS 驱动实验(移植minicom)

    目录 Linux 下UART 驱动框架 I MX6U UART 驱动分析 硬件原理图分析 RS232 驱动编写 移植minicom RS232 驱动测试 RS232 连接设置 minicom 设置 RS232 收发测试 RS485 测试 R
  • win7只能管理计算机软件吗,Win7系统安装软件为何需要获得管理权限才能安装?

    网上查到的方法有WIN7拥有管理员权限的使用方法 1 右键单击 计算机 进入 管理 找到 用户和组 2 找到administrators 右键调出属性 把 该账户已禁用 前面的勾去掉 回桌面 3 新建 记事本 copy 如下内容 Windo
  • 毕业设计记录-yolov5的wandb报错,原因和解决方法(非屏蔽wandb)

    2021 12 26的记录 第一次用yolov5 代码 https github com ultralytics yolov5 每次运行到29轮就会报这个错误 虽然把wandb删掉就不会报错 但是感觉好可惜 试了网上的办法都不能在保留wan
  • linux 网络

    linux 关闭防火墙 https www cnblogs com jiqing9006 p 8257331 html
  • 一个phar://的漏洞

    前段时间打了个护网杯 题目质量是真的高 肉鸡又菜了一整场 遇到了一个不太会的东西 复现了一波 记录下好吧 这个鬼东西就是phar 的序列化的漏洞 介绍一下 phar 跟php filter data 那些一样 都是流包装 可以将一组php文
  • python爬虫学习简记

    目录 页面结构的简单认识 爬虫概念理解 urllib库使用 爬虫解析工具xpath JsonPath Selenium requests基本使用 scrapy 页面结构的简单认识 如图是我们在pycharm中创建一个HTML文件后所看到的内
  • css实现左边定宽右边自适应的两列布局5种方法

    在项目实践中不乏有需要两列式布局 左侧固定右侧自适应是比较常见的布局方式 现在我就来总结一下我自己所知道的5种方法 html代码结构 div class box div class con1 我是左边 div div class con2
  • FM算法解析及Python实现

    1 什么是FM FM即Factorization Machine 因子分解机 2 为什么需要FM 1 特征组合是许多机器学习建模过程中遇到的问题 如果对特征直接建模 很有可能会忽略掉特征与特征之间的关联信息 因此 可以通过构建新的交叉特征这