python 怎么取对数_概率矩阵分解(PMF)及MovieLens上的Python代码

本文介绍了概率矩阵分解(PMF)的概念,针对传统协同过滤算法的不足,详细推导了PMF算法,并使用Python在MovieLens数据集上进行了实验,实现了PMF算法,最终获得了约0.92的RMSE。
摘要由CSDN通过智能技术生成

3ba47bec4227ed0c075ef2e690b9ff93.png

首先对Probabilistic Matrix Factorization这篇论文的核心公式进行讲解和推导;然后用Python代码在Movielens数据集上进行测试实验。

一、 背景知识

文中作者提到,传统的协同过滤算法有两个不足:

1).不能很好地处理规模非常大的数据;

2). 不能很好地处理那些只给出极少评分的用户。

概率矩阵分解则能很好的解决上述提到的这两个问题。

二、算法推导

2.1 定义和描述

假设有

个用户,
个商品,形成一个
维的评分矩阵
, 矩阵
中的元素
表示用户
对商品
的评分。假设潜在特征个数为
,那么
维的矩阵
表示用户的潜在特征矩阵,
用户
的潜在特征向量;
维的矩阵
表示商品的潜在特征矩阵,
商品
的潜在特征向量。概率模型图如下图所示:

4415555db0b8a4d0f5a106160b6587ba.png
图1 PMF的概率模型图

假设关于已知评分数据的条件分布满足高斯分布:

(1)

其中,

为指示函数:如果用户
已经对商品
进行了评分,则为1;否者为0。

再假设用户潜在特征向量和商品潜在特征向量都服从均值为0的高斯先验分布,即:

(2)

注意公式(2)中的

不是指示函数,表示一个对角阵。

然后,计算

的后验概率:

等式两边取对数

后得到:

(3)

2.2 关键处推导

此处插入取对数收到得到公式(3)的详细推导过程(对其中

这一项进行推导):

满足高斯分布,所以可以得到:

其中

,其中
为对角阵,对上述式子取对数
得:

2.3 最优化目标函数

求等式(3)的最大值,等价于最小化目标函数:

(4)

其中,

等式

分别对
进行求导得:

然后用随机梯度下降法(SGD)更新

其中

为步长,或者称之为学习率。
注意:下降的步长大小非常重要,因为如果太小,则找到函数最小值的速度就很慢,如果太大,则又可能会出现震荡。

,上述式子简化为:

(5)

(6)

直到满足收敛条件或迭代至最大的迭代次数。

2.4 改进和优化

论文中还提到,用

函数
代替原来的线性高斯模型,因为线性高斯模型做预测时会产出评分的有效范围。 故将等式(1)修改为如下:

(7)

原始评分

则通过函数
映射到
,然后再参与运算。
为最大评分值。

三、程序实现

3.1 代码及实现

伪代码如下所示:

Input: the number of latent factor K, the learning rata eta, 
regularization parameters lambda_1,lambda_2, the max iteration Step,
and the rating matrix R

Initialization: Initialize a random matrix for user matrix U and item matrix V

for t = 1, 2,...Step do
    for (u,i,r) in R
        make prediction pr=Ui^T*Vj
        error e=r-pr
        update Ui and Vj by (5) and (6)
        the algorithm suffers a loss (Ui, Vj, r)
    end for
end for

下面用python,在 MovieLens 100K 这个数据集上实现PMF算法。

核心代码如下所示:

def update(p, q, r, learning_rate=0.001, lamda_regularizer=0.1):
    error = r - np.dot(p, q.T)            
    p = p + learning_rate*(error*q - lamda_regularizer*p)
    q = q + learning_rate*(error*p - lamda_regularizer*q)
    loss = 0.5 * (error**2 + lamda_regularizer*(np.square(p).sum() + np.square(q).sum()))
    return p,q,loss

3.2 实验结果

当训练集:测试集=8:2时,可得到最终的RMSE为0.92左右,实验曲线如下所示:

6aeeaaf2ac48734dcc86924582d0329d.png
图2 迭代过程中的loss值

aca4c0dda9c2f97cd1a8db545bed0df3.png
图3 迭代过程中的RMSE值

完整项目下载地址:

https://github.com/XiuzeZhou/Recommender-Systems​github.com

更多 矩阵分解内容和程序,请看我的最新博文:

周秀泽:推荐系统系列之二:矩阵分解家族​zhuanlan.zhihu.com
832bae27abd2781ea5e5057217783246.png

参考资料:

[1] 小木,推荐系统之概率矩阵分解的详细推导过程(Probabilistic Matrix Factorization,PMF)

[2] 追溯星霜,PMF:概率矩阵分解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值