FM算法解析及Python实现Bohemian

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

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

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

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

在展示FM算法前,我们先回顾一下最常见的线性表达式:

其中w0为初始权值,或者理解为偏置项,wi为每个特征xi对应的权值。可以看到,这种线性表达式只描述了每个特征与输出的关系。

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

FM表达式的求解核心在于对交叉项的求解。下面是很多人用来求解交叉项的展开式,对于第一次接触FM算法的人来说可能会有疑惑,不知道公式怎么展开的,接下来笔者会手动推导一遍。

设有3个变量(特征)x1x2x3,每一个特征的隐变量分别为v1=(123)、v2=(456)、v3=(121),即:

设交叉项所组成的权矩阵W为对称矩阵,之所以设为对称矩阵是因为对称矩阵有可以用向量乘以向量转置替代的性质。那么W=VVT,即

所以:

实际上,我们应该考虑的交叉项应该是排除自身组合的项,即对于x1x1、x2x2、x3x3不认为是交叉项,那么真正的交叉项为x1x2、x1x3、x2x1、x2x3、x3x1、x3x2。去重后,交叉项即x1x2、x1x3、x2x3。这也是公式中1/2出现的原因。

对交叉项有了基本了解后,下面将进行公式的分解,还是以n=3为例,

上面的例子是对3个特征做的交叉项推导,因此对具有n个特征,FM的交叉项公式就可推广为:

我们还可以进一步分解:

所以FM算法的交叉项最终可展开为:

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

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

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

其中:

inter_1=i*vshape为(1,8)

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

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

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

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

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

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

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

所以回归问题的损失函数对权值的梯度(导数)为:

如果是二分类问题,损失函数一般是logitloss:

所以分类问题的损失函数对权值的梯度(导数)为:

相应的,对于常数项、一次项、交叉项的导数分别为:

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小节)。

THE END
1.史上最简单十大排序算法(Python实现)python排序算法十大排序算法(Python实现) 一.算法介绍及相关概念解读 算法分类 十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界https://blog.csdn.net/weixin_41571493/article/details/81875088
2.算法设计实现(精选十篇)算法设计实现 篇1 现代空间遥感技术的发展已经使传感器的空间分辨率、光谱分辨率和时间分辨率大幅度提高, 使得遥感图像的数据量大增, 有的影像文件大小甚至达到GB级[1], 与此同时, 人们对遥感影像的处理和从影像获取信息的速度却远远落后于影像数据的增长速度, 其原因主要有以下两点: (1) 遥感影像数据量过大, 所https://www.360wenmi.com/f/cnkey3ax105m.html
3.算法:C语言实现(豆瓣)《算法:C语言实现(第1-4部分)基础知识、数据结构、排序及搜索(原书第3版)》细腻讲解计算机算法的C语言实现。全书分为四部分,共16章。包括基本算法分析原理,基本数据结构、抽象数据结构、递归和树等数据结构知识,选择排序、插入排序、冒泡排序、希尔排序、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基https://book.douban.com/subject/4065258/
4.算法的乐趣算法设计也离不开分支和跳转结构,根据对条件的判断,选择合适的处理步骤,是算法实现过程中常用的逻辑。分支和跳转结构算法设计的关键是设计分支条件和算法的跳转流程,一般一个分支条件对应一个处理流程。算法在执行的过程中,根据构造的分支条件进行判断,根据判断的结果转入相应的处理流程继续执行。 根据跳转分支的个数,https://www.ituring.com.cn/book/tupubarticle/5656
5.YOLO系列算法:从yolov1至yolov4的进阶之路(2万字超全整理,建议码BN算法实现: 在卷积或池化之后,激活函数之前,对每个数据输出进行标准化,实现方式如下图所示: 如上图所示,前三行是对Batch进行数据归一化(如果一个Batch中有训练集每个数据,那么同一Batch内数据近似代表了整体训练数据),第四行引入了附加参数 γ和β,这两个参数的具体取值可以参考上面提到的 Batch Normalization 这篇https://www.flyai.com/article/778
6.图的基本算法及其C语言的实现BFS是“一圈一圈往外找”的算法,借助了“循环队列”来实现: voidbfs(AdjListGraph*graph,intstartVertexIndex,bool visit[]){// Loop queue initialization.LoopQueue loopQ;loopQ.front=0;loopQ.rear=0;LoopQueue*loopQueue=&loopQ;enqueue(loopQueue,&(graph->adjList[startVertexIndex]));printf("%c ",https://www.jianshu.com/p/2e82d824c6ea
7.操作系统银行家算法模拟实现(C语言版)51CTO博客(3).银行家算法bank():进行银行家算法模拟实现的模块 (4).显示当前状态show():显示当前资源分配详细情况 (5).主程序main():逐个调用初始化、显示状态、安全性检查、银行家算法函数,使程序有序的进行 四、实验代码 #include<stdio.h> #include<stdlib.h> https://blog.51cto.com/u_15467780/4853379
8.C++实现图的遍历算法(DFS,BFS)的示例代码C语言本文给大家带来的是图遍历的算法,DFS(深度优先遍历),BFS(广度优先遍历)。这两个算法是比较重要和常用的算法,但是在图中的实现只是最基本的操作,快跟随小编一起学习一下吧+ 目录 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用!【 如果你想靠AI翻身,你先需要一个靠谱的工具!】图的定义图由顶点集V(G)和https://www.jb51.net/article/256666.htm
9.2020届计算机科学方向毕业设计(论文)阶段性汇报其中卷积算子通常使用通用矩阵乘算法及其衍生算法实现。本研究基于快速傅里叶变换算法,将原本时域上的卷积变为频域上的乘法操作,从而以较低计算复杂度的方式实现卷积算子。对于其他算子,推导频域上的等价表达并实现。同时结合傅里叶变换的线性性和卷积定理的推论,将整个网络的算子在频域空间中进行计算,达到降低计算量,https://zhiyuan.sjtu.edu.cn/html/zhiyuan/announcement_view.php?id=3709
10.深入理解JVM垃圾收集机制(JDK1.8)腾讯云开发者社区在新生代,每次垃圾收集时都发现大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率较高,没有额外的空间对它进行分配担保,就必须使用”标记-清理“和”标记-整理“算法来进行回收。 HotSpot算法实现https://cloud.tencent.com/developer/article/1069187
11.他们用了什么“手段”让6万项成果完成精准匹配新闻频道智能算法实现有效过滤 通过每年近千项成果的进场交易,知交中心非常清晰地了解到交易热点和行情,并逐步积累评判转化价值的实战经验。 “多年服务高校院所科技成果转化的工作经验,为我们和浙江大学技术转移中心进行合作打下了基础。”陈乐平告诉科技日报记者,双方凭借各自的技术经验,以产业政策、专利数据、需求数据和交易数据https://news.cctv.com/2019/03/28/ARTIEpUIZ35x2G9JfMOdcZqm190328.shtml
12.科学网—高等工程数学:工程问题解决方案的数学基础5.6 模拟退火算法 179 5.6.1 受热金属物体分子状态分布 179 5.6.2 基本模拟退火算法 181 5.6.3 模拟退火算法实现技术 181 5.7 遗传算法 183 5.7.1 基本遗传算法 183 5.7.2 遗传算法实现技术 184 第5章 习题 188 第6章 函数逼近与数据拟合 190 https://blog.sciencenet.cn/blog-528739-1193311.html