Python实现FM (附代码与数据)
网上有很多实现FM的代码,基本一样且没有注释,看着很难受,就重新写了一下。
借鉴的一篇博客地址为https://blog.****.net/john_xyz/article/details/78933253
一、FM原理及用途
FM一般用在CTR预估场景,出处为论文:《Factorization Machines》
FM主要目标是:解决数据稀疏的情况下,特征怎样组合的问题
根据paper的描述,FM有一下三个优点:
1. 可以在非常稀疏的数据中进行合理的参数估计
2. FM模型的时间复杂度是线性的
3. FM是一个通用模型,它可以用于任何特征为实值的情况
算法原理:
在一般的线性模型中,是各个特征独立考虑的,没有考虑到特征与特征之间的相互关系。但实际上,大量的特征之间是有关联的。模型为:
从上面的式子中看出,一般的线性模型没有考虑特征之间的关联。为了表述特征间的相关性,FM就是引入了特征之间的二阶交叉组合,如下:
FM模型与线性模型相比,多了特征组合的部分,特征组合部分的参数有个,n值特征的个数。如果特征非常稀疏且维度很高的话,时间复杂度将大大增加。为了计算方便,引入了辅助向量V表示每个特征,如
,k实际上是一个超参数,决定了辅助向量对特征的表达能力,那么Wij可以看成Vi与Vj的内积,公式可重写为:
这个时候的计算复杂度为,为了再次简化,进行化简:
这个时候复杂度就为 。
FM的梯度
梯度这部分很重要,决定了怎么运算,公式难敲,再次借鉴一下博客:https://blog.****.net/jediael_lu/article/details/77772565#1fm
有了这个我们就可以用代码实现了。
二、在小数据集上的python实现
代码、数据的下载地址:https://pan.baidu.com/s/1TcCV55sgUbjmMVmipJUgSQ
代码基于一个小的分类数据集,用随机梯度下降实现的