天天看点

Python实现FM (附代码与数据)如有问题,请指正,谢谢!

网上有很多实现FM的代码,基本一样且没有注释,看着很难受,就重新写了一下。

借鉴的一篇博客地址为https://blog.csdn.net/john_xyz/article/details/78933253

一、FM原理及用途

FM一般用在CTR预估场景,出处为论文:《Factorization Machines》

FM主要目标是:解决数据稀疏的情况下,特征怎样组合的问题 

根据paper的描述,FM有一下三个优点: 

1. 可以在非常稀疏的数据中进行合理的参数估计 

2. FM模型的时间复杂度是线性的 

3. FM是一个通用模型,它可以用于任何特征为实值的情况

算法原理:

在一般的线性模型中,是各个特征独立考虑的,没有考虑到特征与特征之间的相互关系。但实际上,大量的特征之间是有关联的。模型为:

Python实现FM (附代码与数据)如有问题,请指正,谢谢!

从上面的式子中看出,一般的线性模型没有考虑特征之间的关联。为了表述特征间的相关性,FM就是引入了特征之间的二阶交叉组合,如下:

Python实现FM (附代码与数据)如有问题,请指正,谢谢!

FM模型与线性模型相比,多了特征组合的部分,特征组合部分的参数有

Python实现FM (附代码与数据)如有问题,请指正,谢谢!

个,n值特征的个数。如果特征非常稀疏且维度很高的话,时间复杂度将大大增加。为了计算方便,引入了辅助向量V表示每个特征,如

Python实现FM (附代码与数据)如有问题,请指正,谢谢!

,k实际上是一个超参数,决定了辅助向量对特征的表达能力,那么Wij可以看成Vi与Vj的内积,公式可重写为:

Python实现FM (附代码与数据)如有问题,请指正,谢谢!

这个时候的计算复杂度为

Python实现FM (附代码与数据)如有问题,请指正,谢谢!

,为了再次简化,进行化简:

Python实现FM (附代码与数据)如有问题,请指正,谢谢!

这个时候复杂度就为

Python实现FM (附代码与数据)如有问题,请指正,谢谢!

 。

FM的梯度

梯度这部分很重要,决定了怎么运算,公式难敲,再次借鉴一下博客:https://blog.csdn.net/jediael_lu/article/details/77772565#1fm

Python实现FM (附代码与数据)如有问题,请指正,谢谢!
Python实现FM (附代码与数据)如有问题,请指正,谢谢!

 有了这个我们就可以用代码实现了。

二、在小数据集上的python实现

代码、数据的下载地址:https://pan.baidu.com/s/1TcCV55sgUbjmMVmipJUgSQ

代码基于一个小的分类数据集,用随机梯度下降实现的

如有问题,请指正,谢谢!