FM(Factorization Machines)因子分解机
主要适用的场景就是高维稀疏特征环境下,在确定输入后,它也近似于支持向量机和多项式回归。
其主要想法是,遍历所有特征,进行特征的组合,如下图,一阶特征是6个,二阶特征就有15个。
我们用如下的公式进行计算,但考虑到两个问题,一个是如上图所示,类别特征进行one-hot后会变的特征空间变大样本就变得稀疏,其次当特征组合后,新特征的样本量会变的更稀疏的问题。
利用上式求解,使用梯度下降,由于样本量的稀疏,参数很难收敛。其次,当d=2时,由于引入特征组合也就会增添n(n-1)/2个参数w。
FM通过对w进行分解,一是可以减少模型参数,二是可以挖掘特征组合之间的相关性(个人理解)
这时参数变成了nk个,
进一步化简:
计算复杂度变成了O(nk)
FM的优点:
- 可以在非常稀疏的数据中进行合理的参数估计
- FM模型的时间复杂度是线性的
- FM是一个通用模型,它可以用于任何特征为实值的情况
python实现代码:
import numpy as np
np.random.seed(0)
import random
def sigmoid(z):
return 1.0 / (1.0 + np.exp(-z))
def sigmoid_prime(z):
"""
sigmoid函数对z求一阶偏导
:param z:
:return:
"""
return sigmoid(z) * (1 - sigmoid(z))
class QuadraticCost(object):
@staticmethod
def fn(a, y):
"""
平方误差损失函数
:param a: 预测值
:param y: 真实值
:return:
"""
return 0.5 * np.linalg.norm(a - y) ** 2
@staticmethod
def delta(z, a, y):
"""
损失函数对z求偏导
:param z: x的线性函数
:param a:
:param y:
:return:
"""
return (a - y) * sigmoid_prime(z)
class FM(object):
def __init__(self, train, valid, k, eta, maxecho, r2, cost=QuadraticCost):
"""
构造函数
:param