前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >推荐算法|FM模型python

推荐算法|FM模型python

作者头像
三猫
发布2021-07-20 11:52:41
9410
发布2021-07-20 11:52:41
举报

导读:上篇文章推荐算法|FM模型原理简介中我们介绍了FM模型原理,本次我们通过python进行实例展示。为了提升模型性能,本次代码同步引入加入L2正则及Adagrad。

1

概念回顾

我们首先来回顾一下梯度下降法、Adagrad的概念。

  • 梯度下降法

假设损失函数为:

则对于每个参数其梯度表达式为:

进而得到参数的更新函数:

其中alpha为学习率。

  • Adagrad

梯度下降中有学习率参数,合适的学习率会影响模型训练效率及准确性。Adagrad的核心思想就是随着迭代次数增加,让学习率变小。加入后,参数的迭代变为:

其中

为初始学习率,g为参数对应的梯度。

2

代码逻辑

本例中我们通过梯度下降来训练一个二分类FM模型。

对于二分类问题,我们取logit作为损失函数:

我们的目标就是使得上述损失函数最小的最优化问题。假设共有N个参数,并且在损失函数中加入L2正则以减少过拟合,则最优化问题变为:

在FM模型中,参数的梯度为:

其中

根据Adagrad更新学习率,就得到最终计算方法。整个过程伪代码如下:

3

python实现

此处仅展示核心代码,获得完整代码方法在文末。

代码语言:javascript
复制
def FM_function_L2_Adagrad(dataMatrix, classLabels, k, iter):
    lamda = 1 #正则化参数
    m, n = shape(dataMatrix)
    alpha = 1
    #1、初始化参数
    w = zeros((n, 1))
    w_0 = 0.
    v = normalvariate(0, 0.2) * ones((n, k))
    w0_ada = 1.
    w_ada = 1.
    v_ada = 1.
    w0_grad = 0.
    w_grad = 0.
    v_grad = 0.
    alpha_w0 = alpha
    alpha_w = alpha
    alpha_v = alpha
    
    #2、训练
    for it in range(iter):
        for x in range(m):
            inter_1 = dataMatrix[x] * v
            inter_2 = multiply(dataMatrix[x], dataMatrix[x]) * multiply(v, v)
            #完成交叉项
            interaction = sum(multiply(inter_1, inter_1) - inter_2) / 2.   
            p = w_0 + dataMatrix[x] * w + interaction  
            loss = classLabels[x] * p[0, 0] - 1        
            #加入adagrad
            w0_grad += (loss* classLabels[x] +w_0*lamda) ** 2  
            w_0 -= alpha_w0 * (loss* classLabels[x] *+w_0*lamda)          
            for i in range(n):
                if dataMatrix[x, i] != 0:                 
                    #加入adagrad
                    w_grad += (loss* classLabels[x] +w[i, 0]*lamda) ** 2  
                    w[i, 0] -= alpha_w * (loss* classLabels[x] * dataMatrix[x, i] + w[i, 0]*lamda)                    
                    for j in range(k):
                        #加入adagrad
                        v_grad += (loss * classLabels[x]* (dataMatrix[x, i] * inter_1[0, j] - v[i, j] * dataMatrix[x, i] * dataMatrix[x, i]) + v[i, j]*lamda) ** 2  
                        v[i, j] -= alpha_v * (loss  *classLabels[x] * (dataMatrix[x, i] * inter_1[0, j] - v[i, j] * dataMatrix[x, i] * dataMatrix[x, i]) + v[i, j]*lamda)  
        w0_ada = np.sqrt(w0_grad)  
        w_ada = np.sqrt(w_grad)  
        v_ada = np.sqrt(v_grad)
        alpha_w0 = alpha/w0_ada
        alpha_w = alpha/w_ada
        alpha_v = alpha/v_ada
    return w_0, w, v

后台回复“FM”可获得相关材料


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档