FM(因子分解机)
FM通过对特征之间的隐变量内积来提取特征组合
- FM和集成树模型(如GDBT)都可以自动学习特征交叉组合
- FM可以在非常稀疏的数据中进行合理的参数估计
- FM的时间复杂度是线性的
- FM是一个通用模型,可以用于任何特征为实值的情况
在一般的线性模型中,各个特征是独立考虑的,并未考虑各特征之间的相互关系。实际上特征之间是相互关联的。为了表示特征之间的相互性,采用多项式模型。
#_*_coding:utf-8_*_
import torch
import torch.nn as nn
class FM(nn.Module):
def __init__(self,n = 10,k = 5):
'''
:param n: 输入的维度n
:param k: 超参数k,相对于为输入x的每一个维度定义一个特征向量
'''
super(FM,self).__init__()
self.n = n
self.k = k
self.linear = nn.Linear(self.n,1) #前两项线性层
#将不可训练的tensor转化成可训练的类型parameter()
self.V = nn.Parameter(torch.randn(self.n,self.k)) #交互矩阵
def fm_layer(self,x):
linear = self.linear(x)
interaction_part_1 = torch.mm(x,self.V)
interaction_part_1 = torch.pow(interaction_part_1,2)
interaction_part_2 = torch.mm(torch.pow(x,2),torch.pow(self.V,2))
output = linear + torch.sum(0.5 * interaction_part_2 - interaction_part_1)
return output
def forward(self, x):
return self.fm_layer(x)
fm = FM(10,5)
x = torch.randn(1,10)
output = fm(x)
print(output.size())