一、前言
FFM在FM的基础上进一步改进,在模型中引入类别的概念,即field。将同一个field的特征单独进行one-hot,因此在FFM中,每一维特征都会针对其他特征的每个field,分别学习一个隐变量,该隐变量不仅与特征相关,也与field相关。通过引入field的概念,FFM把相同性质的特征归于同一个field。
二、FFM模型
在说FFM之前,最好先了解下FM模型
Factorization Machines(FM):发展过程、原理及实现_只想做个咸鱼的博客-优快云博客
文章中提到FM的公式:
红色两项,分别代表用隐向量内积表示权重系数矩阵,特征的交叉组合
FM存在的问题就是模型在进行特征表示时,是与所有的特征进行组合,即它对所有的特征组合时所用的表示都是一样的,至少也得权衡各个类别里面的交互特征学到,意味着不同的特征应该所表示的不同,例如男和北京、男和篮球,而男与另外两个特征组合时所用的表示是一样,这体现不出他们的不同和重要性
引出FFM的数学表达式:
可以看到蓝色的隐向量部分多了fj和fi这就是添加的域表示,也可以等同额外添加了另一组隐向量,用来表示特征域的概念,用以区分特征与特征之间的区别,用来增强模型的表示。
三、代码实现
class FFM_Node(object):
'''
通常x是高维稀疏向量,所以用链表来表示一个x,链表上的每个节点是个3元组(j,f,v)
''&