当前位置:网站首页>新生任务-5
新生任务-5
2022-07-17 05:00:00 【言山兮尺川】
一、Funk-SVD 分解算法
对于一个推荐系统, 用户和物品之间的关系可以整理为如下这样的一个矩阵.
| User-Item | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 1 | x | 4.5 | 2.0 | x |
| 2 | 4.0 | x | 3.5 | x |
| 3 | x | 5.0 | x | 2.0 |
| 4 | x | 3.5 | 4.0 | 1.0 |
矩阵中每一行代表一个用户, 而每一列则代表一个物品. 若用户对物品有过评分, 则矩阵中处在用户对应的行与物品对应的列交叉的位置表示用户对物品的评分值. 矩阵中的 ‘x’ 代表用户对物品未评分. 这个矩阵就叫做User-Item 评分矩阵, 这个矩阵中的数在实际统计后大多数现显示为问号.
推荐系统需要做的事情就是对于任意一个用户, 预测出所有未评分物品的分值, 并按分值大小从高到低的顺序推荐将对应的物品推荐给用户.
我们需要做的就是求出矩阵中 ‘x’ 的值.
和 S V D SVD SVD 算法需要三个矩阵不同, F u n k − S V D Funk-SVD Funk−SVD 算法只需要两个矩阵. 如下图所示

此时我们就有公式
R m × n ≈ P m × k Q k × n = M ^ m × n R_{m \times n} \approx P_{m \times k} Q_{k \times n} = \hat{M}_{m \times n} Rm×n≈Pm×kQk×n=M^m×n
评分矩阵 R R R 是一个 m × n m \times n m×n 的矩阵, 一共有 m m m 个用户, n n n 个物品. 通过一系列运算将矩阵 R R R 转化为两个矩阵 P P P 和 Q Q Q, 矩阵 U U U 的大小是 m × k m \times k m×k, 矩阵 Q Q Q 的大小是 k × n k \times n k×n.
因为矩阵 R R R 中存在未知, 我们只是在对这个矩阵进行拟合, 所以是约等于.
该方法基于这样一个假设: 用户对一个物品的喜爱程度主要由 k k k 个因素决定, P n i P_{ni} Pni 表示第 n n n 个用户对第 i i i 个因素的偏好程度, 而 Q i x Q_{ix} Qix 表示第 x x x 个物品满足第 i i i 个因素的程度, R n x R_{nx} Rnx 表示用户 n n n 对物品 x x x 最终的喜好程度.
这时就存在着几个问题, 评价拟合程度的指标?如何获取 P , Q P,Q P,Q 两矩阵?
先回答第一个问题, 拟合程度越高就说明 P Q P \ Q P Q 两矩阵的乘积越靠近矩阵 R R R. 这里用 S S E SSE SSE (和平方) 来表示, 那么就有公式.
S S E = E U , I 2 = ∑ U , I ( R U , I − R ^ U , I ) 2 SSE = E_{U,I}^2 = {\textstyle \sum_{U,I}}(R_{U,I} \ - \ \hat{R}_{U,I})^2 SSE=EU,I2=∑U,I(RU,I − R^U,I)2
现在的问题就转化为了求在损失 S S E SSE SSE 最小时的矩阵 P P P 和 Q Q Q. 这也回答了如何获取 P , Q P,Q P,Q 两矩阵这个问题.
二、梯度下降
对于多维变量的函数, 梯度为 0 的点有三种情况——极大值、极小值、鞍点. 极小值是梯度下降过程最稳定的不动点. 迭代过程可以参照下雨的时候水的流向, 水总是会聚集在坑 (极小值) 里面.
但是我们要找的是负梯度. 举个例子
函数 f ( x ) = x 2 f(x)=x^2 f(x)=x2 就是一个凸函数, 满足 f ( x 1 + x 2 2 ) ≤ f ( x 1 ) + f ( x 2 ) 2 f(\frac{x_1+x_2}{2}) \le \frac{f(x_1)+f(x_2)}{2} f(2x1+x2)≤2f(x1)+f(x2). 其图像如下所示:

假设点 (-5,25) 要朝向最低点移动, 它此时的梯度为 -10, 应该往 x 正方向移动使得梯度为 0.
假设点 (5,25) 要朝向最低点移动, 它此时的梯度为 10, 应该往 x 负方向移动使得梯度为 0.
回到之前求的损失函数, 就有以下两个步骤
1.求解损失函数的梯度
S S E = E U , I 2 = ∑ U , I ( R U , I − ∑ k = 1 K P U , k Q k , I ) 2 SSE = E_{U,I}^2 = {\textstyle \sum_{U,I}}(R_{U,I} \ - \ {\textstyle \sum_{k=1}^{K}}P_{U,k} \ Q_{k,I} )^2 SSE=EU,I2=∑U,I(RU,I − ∑k=1KPU,k Qk,I)2
S S E SSE SSE 是关于 P P P 和 Q Q Q 的多元函数, 当随机选定 U U U 和 I I I 后, 需要枚举所有的 k k k, 并且对 P U , k P_{U,k} PU,k 以及 Q k , I Q_{k,I} Qk,I 求偏导数.
∂ ∂ P U , k E U , I 2 = 2 E U , I ∂ E U , I ∂ P U , k = − 2 E U , I Q k , I \frac{\partial}{\partial P_{U,k}}{E_{U,I}}^2 = 2 E_{U,I}\frac{\partial E_{U,I}}{\partial P_{U,k}} = -2E_{U,I}Q_{k,I} ∂PU,k∂EU,I2=2EU,I∂PU,k∂EU,I=−2EU,IQk,I
∂ ∂ Q k , I E U , I 2 = 2 E U , I ∂ E U , I ∂ Q k , I = − 2 E U , I P U , k \frac{\partial}{\partial Q_{k,I}}{E_{U,I}}^2 = 2 E_{U,I}\frac{\partial E_{U,I}}{\partial Q_{k,I}} = -2E_{U,I}P_{U,k} ∂Qk,I∂EU,I2=2EU,I∂Qk,I∂EU,I=−2EU,IPU,k
2.根据负梯度变化更新变量
P U , k = P U , k − α ( − 2 E U , I Q k , I ) = P u , k + 2 α E U , I Q k , I P_{U,k} = P_{U,k} - \alpha (-2E_{U,I}Q_{k,I}) = P_{u,k} + 2 \alpha E_{U,I}Q_{k,I} PU,k=PU,k−α(−2EU,IQk,I)=Pu,k+2αEU,IQk,I
Q k , I = Q k , I − α ( − 2 E U , I P U , k ) = Q k , I + 2 α E U , I P U , k Q_{k,I} = Q_{k,I} - \alpha (-2E_{U,I}P_{U,k}) = Q_{k,I} + 2 \alpha E_{U,I}P_{U,k} Qk,I=Qk,I−α(−2EU,IPU,k)=Qk,I+2αEU,IPU,k
公式推导到此完结, P Q P \ Q P Q 两矩阵初始化的元素值设为随机数.
三、代码实例
from math import *
import numpy as np
def matrix_factorization(R, P, Q, steps = 5000, alpha = 0.0002):
Q = Q.T
for _ in range(steps):
for i in range(len(R)):
for j in range(len(R[i])):
eij = R[i][j] - np.dot(P[i,:],Q[:,j])
for k in range(K):
if R[i][j] > 0:
P[i][k] = P[i][k] + 2 * alpha * eij * Q[k][j]
Q[k][j] = Q[k][j] + 2 * alpha * eij * P[i][k]
# SSE
e = 0
for i in range(len(R)):
for j in range(len(R[i])):
if R[i][j]>0:
e = e + pow(R[i][j] - np.dot(P[i,:],Q[:,j]),2)
# Is result convergence?
if e < 0.001:
break
return P,Q.T
if __name__ == '__main__':
R = [
[0,4.5,2,0],
[4,0,3.5,0],
[0,5,0,2],
[0,3.5,4,1]
]
R = np.array(R)
# The Row of Matrix R
M = len(R)
# The Column of Matrix R
N = len(R[0])
# The Hidden factor number
K = 2
# Get a random matrix P : M rows K columns
P = np.random.rand(M,K)
# Get a random matrix Q : N rows K columns
Q = np.random.rand(N,K)
new_P, new_Q = matrix_factorization(R,P,Q)
print("The original matrix is : ")
print(R)
print("The new matrix is : ")
R_MF = np.dot(new_P,new_Q.T)
print(R_MF)
输入 : 原始矩阵和隐藏因子 K. 例如下所示
[
[0,4.5,2,0],
[4,0,3.5,0],
[0,5,0,2],
[0,3.5,4,1]
]
代码示例中默认设置 K 为 2.
输出 : 通过矩阵分解拟合后的矩阵. 由此可得出未知评分.

边栏推荐
- Expected to replace deepfake? Uncover this year's super popular nerf Technology
- Redis简介
- 网址在线封装APK系统源码
- [Vuforia] 图像识别的简单逻辑
- 【FPGA教程案例27】通过Verilog实现双口RAM乒乓结构
- Tidb learning
- TiDB学习笔记【初阶】
- [FPGA tutorial case 26] realize the basic operation of decimals through Verilog in FPGA
- 面临的挑战和优势,并预测NeRF最终将取代Deepfake
- [vuforia] simple logic of image recognition
猜你喜欢

minio安装部署及使用

Pytorch image models (Timm) library

Unity UMP打包黑屏问题总结

【TA-霜狼_may-《百人计划》】基础渲染光照介绍(一)

【燃料电池】基于simulink的燃料电池系统控制策略仿真

老年祝福火爆短视频微信小程序源码下载支持流量主

Gin框架原理
![[FPGA tutorial case 27] realize dual port RAM ping-pong structure through Verilog](/img/64/211c5a6d6e0a8701136fa969d6d9e4.png)
[FPGA tutorial case 27] realize dual port RAM ping-pong structure through Verilog

Usage scenarios and usage of judgment and rounding down in MySQL

Problems encountered by Sphinx
随机推荐
MySQL必知必会!!!看这一篇就足够了!!!
面临的挑战和优势,并预测NeRF最终将取代Deepfake
简洁UI好玩的文字转换emoji表情微信小程序支持句子词语转换_源码
【燃料电池】基于simulink的燃料电池系统控制策略仿真
N-Beats模型于2020年发布,并且优于M4比赛的获胜者3%!
Unity UMP打包黑屏问题总结
网址在线封装APK系统源码
微信小程序之项目结构
Policy mode replaces if else
TCP/IP 协议
Project structure of wechat applet
[unity] interactive double click
快速掌握MIPI开发攻略
复旦微FMQL(国产Zynq) 【IAR裸机开发之PS】——非字节对齐访问
C list set object de duplication LINQ de duplication with time de duplication
MySQL表的查询进阶
[daily question] sword finger offer II 041 Average value of sliding window
Problems encountered by Sphinx
Leetcode remove element
手机平台上的用户空间锁概述