TensorFlow2实现协同过滤算法中的矩阵分解(首家基于TS2版本)

目标:

用TensorFlow2,实现协同过滤算法中的矩阵分解。网上找的绝大部分是基于一个模板复制出来的,且基于TensorFlow1,因此本人亲自动手,用TensorFlow2实现。

  • 好奇为什么TensorFlow2不帮我们实现了,在Spark中,直接调用spark.mllib.recommendation.ALS() 就好了。

内容:

在推荐系统中,协同过滤算法是很常用的推荐算法。中心思想:物以类聚,人以群分。也就是口味相同的人,把他喜欢的物品或者电影歌曲推荐给你;或者是将你喜欢的物品,类似的物品推荐给你。
整体流程:
1、 获取用户对商品的评分、购买记录等
2、 构造协同矩阵M
3、 基于矩阵进行分解M=U*V
4、 利用要推荐的物品或者用户,和U或者V计算相似度


代码:

TensorFlow2可以自动帮你求导更新参数,太方便了,你要做的就是构造损失函数loss而已。
loss函数可以理解为,我们分解得到U*V得到预测的M_pre,用M和M_pre求欧式距离:即欧几里得距离(Euclidean Distance)
公式具体为:
在这里插入图片描述

大致意思就是分解一个大矩阵为两个小矩阵相乘。
在这里插入图片描述

具体代码为:

'''=================================================
@Function -> 用TensorFlow2实现协同过滤矩阵的分解
@Author :luoji
@Date   :2021-10-19
=================================================='''

import numpy as np
import tensorflow as tf

def matrixDecomposition(alike_matix,rank=10,num_epoch= 5000,learning_rate=0.001,reg=0.5):
    row,column = len(alike_matix),len(alike_matix[0])
    y_true = tf.constant(alike_matix, dtype=tf.float32)  # 构建y_true
    U = tf.Variable(shape=(row, rank), initial_value=np.random.random(size=(row, rank)),dtype=tf.float32)  # 构建一个变量U,代表user权重矩阵
    V = tf.Variable(shape=(rank, column), initial_value=np.random.random(size=(rank, column)),dtype=tf.float32)  # 构建一个变量,代表权重矩阵,初始化为0

    variables = [U,V]
    optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)
    for batch_index in range(num_epoch):
        with tf.GradientTape() as tape:
          y_pre = tf.matmul(U, V)
          loss = tf.reduce_sum(tf.norm(y_true-y_pre, ord='euclidean')
                               + reg*(tf.norm(U,ord='euclidean')+tf.norm(V,ord='euclidean')))  #正则化项
          print("batch %d : loss %f" %(batch_index,loss.numpy()))

        grads = tape.gradient(loss,variables)
        optimizer.apply_gradients(grads_and_vars=zip(grads,variables))
    return U,V,tf.matmul(U, V)

if __name__ == "__main__":
    # 把矩阵分解为 M=U*V ,U和V由用户指定秩rank
    alike_matrix = [[1.0, 2.0, 3.0],
                   [4.5, 5.0, 3.1],
                   [1.0, 2.0, 3.0],
                   [4.5, 5.0, 5.1],
                   [1.0, 2.0, 3.0]]
    U,V,preMatrix = matrixDecomposition(alike_matrix,rank=2,reg=0.5,num_epoch=2000) # reg 减小则num_epoch需增大

    print(U)
    print(V)
    print(alike_matrix)
    print(preMatrix)
    print("this difference between alike_matrix and preMatrix is :")
    print(alike_matrix-preMatrix)
    print('loss is :',sum(sum(abs(alike_matrix - preMatrix))))

待分解的矩阵:
[[1.0, 2.0, 3.0],
[4.5, 5.0, 3.1],
[1.0, 2.0, 3.0],
[4.5, 5.0, 5.1],
[1.0, 2.0, 3.0]]

分解后,相乘的到的矩阵:

[[1.0647349 1.929376 2.9957888]
[4.6015587 4.7999315 3.1697667]
[1.0643657 1.9290545 2.9957101]
[4.287443 5.211667 4.996485 ]
[1.0647217 1.9293401 2.9957187]],

可以看出两者还是很相似的,证明我们用TensorFlow2进行的矩阵分解是正确的。
注意,正则化项reg需要和num_epoch配套,reg越大,收敛越快,但效果不一定最好。


产出:

TensorFlow2,实现协同过滤算法中的矩阵分解,而且该模块可以直接复用。
1、加深了对TensorFlow2的理解,太神奇了,只要找到损失函数loss,模型就可以训练。Amazing!
2、CSDN 技术博客1 篇,全网找不到第二个基于TensorFlow2实现的。好奇为什么TensorFlow2不帮我们实现了,在Spark中,直接调用spark.mllib.recommendation.ALS() 就好了

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于协同过滤算法的在线图书推荐系统是利用用户对图书的评分行为以及图书之间的相似性来为用户推荐可能感兴趣的图书。在这个系统,ALS矩阵分解算法是一种基于模型的协同过滤算法。 ALS矩阵分解算法是一种常用的协同过滤算法,其主要思想是将用户-图书评分矩阵分解为两个低维度的矩阵,通过学习用户和图书的隐含特征来预测用户对未评价图书的评分,并根据预测评分来进行推荐。 具体而言,ALS矩阵分解算法分为两个步骤:交替最小二乘法和优化用户/图书隐向量。在交替最小二乘法,通过固定隐向量一个变量,更新另一个变量,直到收敛。在优化用户/图书隐向量过程,通过最小化预测评分和实际评分之间的差距来优化隐向量。 在在线图书推荐系统,首先需要根据用户的历史评分数据构建用户-图书评分矩阵。然后,通过ALS矩阵分解算法来训练模型,得到用户和图书的隐向量。接下来,对于一个给定的用户,可以通过计算用户的隐向量与图书的隐向量之间的相似性来获取与用户兴趣最相似的图书。最后,根据相似性进行推荐,将推荐的图书推送给用户。 基于协同过滤算法的在线图书推荐系统不仅考虑用户的历史行为,还能通过挖掘图书之间的相似性来为用户推荐可能感兴趣的图书。通过使用ALS矩阵分解算法,系统可以根据用户行为数据进行模型训练和隐向量推断,从而提高图书推荐的准确性和个性化程度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值