目标:

用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 tfdef 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_trueU = 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)  # 构建一个变量,代表权重矩阵,初始化为0variables = [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由用户指定秩rankalike_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() 就好了

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

  1. 基于协同过滤算法的在线鲜花店推荐系统详解及GitHub下载

    [[TOC]] 基于协同过滤的在线鲜花店推荐系统 项目需求: 基于店铺的客户订单记录,实现店铺的推荐需求: 基于RFM模型,得到客户的价值分类,对高价值客户进行重点跟踪,推荐其潜在的商品列表,即实现: ...

  2. 协同过滤算法深入解析:构建智能推荐系统的核心技术

    一.前言 二.协同过滤算法简介 三.基于用户的协同过滤 3.1 用户相似度计算 3.2 预测用户评分 四.基于物品的协同过滤 4.1 物品相似度计算 4.2 预测用户评分 五.矩阵分解方法 5.1 奇 ...

  3. 推荐系统中的矩阵分解总结

    最近学习矩阵分解,但是学了好多种类,都乱了,看了这篇文章,系统性的总结了矩阵分解,感觉很棒,故分享如下: 前言 推荐系统中最为主流与经典的技术之一是协同过滤技术(Collaborative Filte ...

  4. 推荐系统中协同过滤算法实现分析

    原创博客,欢迎转载,转载请注明:http://my.oschina.net/BreathL/blog/62519 最近研究Mahout比较多,特别是里面协同过滤算法:于是把协同过滤算法的这个实现思路与 ...

  5. 推荐系统中协同过滤算法实现分析(重要两个图!!)

    "协",指许多人协力合作. "协同",就是指协调两个或者两个以上的不同资源或者个体,协同一致地完成某一目标的过程. "协同过滤",简单来 ...

  6. ItemCF,基于物品的协同过滤算法

    转载自   ItemCF,基于物品的协同过滤算法 ItemCF:Item Collaboration Filter,基于物品的协同过滤 算法核心思想:给用户推荐那些和他们之前喜欢的物品相似的物品. 比 ...

  7. UserCF,基于用户的协同过滤算法

    转载自   UserCF,基于用户的协同过滤算法 UserCF:User  Collaboration   Filter,基于用户的协同过滤 算法核心思想:在一个在线推荐系统中,当用户A需要个性化推荐 ...

  8. 个性化智能推荐(协同过滤算法)技术研究

    个性化智能推荐(协同过滤算法)技术研究 一.  协同过滤推荐(Collaborative Filtering简称 CF)        协同过滤技术是目前推荐系统中最成功和应用最广泛的技术,在理论研究 ...

  9. 基于聚类分析和协同过滤算法的营养膳食分析系统的设计与实现

    1 简介 今天向大家介绍一个帮助往届学生完成的毕业设计项目,基于聚类分析和协同过滤算法的营养膳食分析系统的设计与实现. 1. 协同过滤的算法思想 1.1. 基于内容的推荐中不足之处 基于内容的推荐方法 ...

最新文章

  1. 单调有界数列一定有极限
  2. javascript DOM(08-21)
  3. erosa mysql_MySQL协议和canal实现
  4. syn攻击 喝茶_如何喝茶
  5. linux 下/proc/cpuinfo三级缓存,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  6. 迭代DOM集合的几种方法
  7. ubuntu lvs keepalived mysql_ubuntu下LVS + Keepalived 实现mysql高可用负载均衡实现
  8. idea复制web项目没有servlet选项
  9. 畅管进销存管理系统 v6.0
  10. Java List retainAll方法使用注意事项
  11. VNet医学影像网络论文详解
  12. 计算机平均工资公式数值型,平均工资的计算方式
  13. VO快速搜索 宝马VO 宝马VO翻译 VO码查询工具
  14. 三位水仙花数python代码
  15. python from用法_python学习笔记1_import与from方法总结
  16. 怎样增加图片的大小,不是尺寸哦!
  17. 【Java】Unicode转中文代码实现
  18. 解决win7-win8 chcp命令无法使用
  19. java mybatis的SpringBoot博客论坛管理系统
  20. 分享机器学习入门课件

热门文章

  1. boa linux arm修改网卡,嵌入式linux架设boa webserver
  2. mysql 插入怎么知道id_如何知道刚刚插入数据库那条数据的id
  3. goland go test_七天用Go写个docker(第一天)
  4. linux自动获取ip网卡配置文件,linux 命令行下配置网卡自动获取 IP
  5. 看完这个你还不理解右值引用和移动构造 你就可以来咬我(中)
  6. Android开发之Java的IO流读写的十种方法
  7. 春运12306的bug
  8. Android开发之自定义菊花进度条对话框
  9. linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构
  10. 初探Java设计模式1:创建型模式(工厂,单例等)