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

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 RInitialization: Initialize a random matrix for user matrix U and item matrix Vfor t = 1, 2,...Step dofor (u,i,r) in Rmake prediction pr=Ui^T*Vjerror e=r-prupdate 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:概率矩阵分解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA SE、EE、ME,JRE、JDK,基本数据类型,访问修饰符、函数、封装的概念、UML类图、构造方法、this关键字、static关键字、方法重载、方法重写、包(packahe)

运行第一个JAVA程序: 这里使用的开发环境是eclipse,新建一个java工程,然后可以看到src这个是存放java代码的地方,然后在src文件右击新建一个class(类),然后可以看到下图,同样和C语言…

unity中如何解决镜头穿透模型?

设置相机的Near clip plane,调小一点,但是不要给负数就行。 转载于:https://www.cnblogs.com/ZeroMurder/p/5331174.html

Shell脚本中函数位置参数的用法笔记

位置参数主要是用于调用函数的时候有时候需要传递参数,有很大的比例都是需要调用函数的时候动态传递参数,从而实现相应的功能。比如我想要计算两个数的和,可以通过函数是实现,需要定义两个参数作为计算的值。这样的计算两个数的函…

生鲜配送小程序源码_生鲜社区团购配送系统小程序源码搭建平台模式

生鲜配送系统开发,找【金生157威6875店2419同号】生鲜配送模式开发,生鲜配送软件开发,生鲜配送APP开发,生鲜配送平台开发平台,生鲜配送系统源码开发平台,生鲜配送系统平台,生鲜配送系统定制开发…

软件开发的早期为何要进行可行性研究?该从哪几个方面研究目标系统的可行性?...

因为并非任何问题都有简单明显的解决办法,很多问题不可能在预定的系统规模或者时间期限内解决。如果问题没有可行的解决方案,那么花费在这工程上的任何时间人力经费等资源都是浪费。。 一般来说,至少应该从如下3个方面研究其可行性&#xff1…

继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类

这篇博客将会涉及到: 继承的概念和实现super关键字方法重写—OverrideObject常见方法 继承的概念: 生活中,继承的概念随处可见,继承需要符合的关系:is-a;父类更通用、子类更特殊更具体。就比如说&#x…

盘点关于程序员的10个有趣的段子

(1)程序员的读书历程:x 语言入门 —> x 语言应用实践 —> x 语言高阶编程 —> x 语言的科学与艺术 —> 编程之美 —> 编程之道 —> 编程之禅—> 颈椎病康复指南。(2)程序员最讨厌的四件事&#x…

oracle 修索引改空间_Oracle如何更改表空间的数据文件位置详解

表空间概述Oracle的表空间属于Oracle中的存储结构,是一种用于存储数据库对象(如:数据文件)的逻辑空间,是Oracle中信息存储的最大逻辑单元,其下还包含有段、区、数据块等逻辑数据类型。表空间是在数据库中开辟的一个空间&#xff0…

开发 调试

在开发中,若代码已写完,服务器上运行却出错,或者没有结果。此时,应想办法尽可能获取更多的信息,有如下方法:[今后要根据学习、工作持续增加内容] 1、打开浏览器的调试,谷…

Linux 用户管理命令笔记

目录 1、新增用户 2、删除用户 3、修改用户 4、修改用户密码 1、新增用户 useradd user1 用户创建流程 1、系统先将用户信息记录在/etc/passwd中,一般会在/etc/passwd和/etc/shadow末尾,同时分配该用户UID。 2、创建用户目录,一般创建路径/home目录中。…

多态的概念、对象上下转型、多态的应用、异常(异常概念、异常分类、java异常处理机制、try...catch...finally、throw和throws、自定义异常)

多态的概念: 多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果。多态存在的三个必要条件: ① 需要存在继承或实现关系 ② 同样的方法调用而执行不同的操作、运行不同代码(重写)…

tomcat依赖导入步骤_Tomcat长生不老之术——嵌入式

前言Tomcat是一个非常流行的Web服务器,用于部署和运行Java Web应用程序。一般情况下,我们都是在单独的Tomcat实例上运行自己的Web应用,其实与这种经典方案相比,我们可以将服务器运行时直接集成到应用程序中,从而更加的…

Linux用户组笔记整理

目录 一、Linux用户组概念 二、常用命令 三、用户组信息存储位置 一、Linux用户组概念 Linux用户组(group)就是具有相同操作权限范围的Linux用户管理起来; 比如有时我们要让同一类用户具有相同的权限,比如查看、修改某一文件或执…

java泛型、泛型类及特点、限制泛型、类型通配符声明、泛型方法

java泛型: 泛型简介泛型类限制泛型可用类型类型通配声明泛型方法 问题: 如果我们需要产生多个对象,每个对象的逻辑完全一样,只是对象内的成员变量的类型不同。那我们该如何去做?如果按照正常的做法就要创建多个类文件…

不生效 设置了viewport_配置viewport

最近项目中需要开发内嵌的H5页面,viewport不是很熟悉,故来翻译一下此篇文件加深理解原文配置viewportIOS上的safari使用一种缩放的工作模式来展示pc端的网页,如果默认的设置对你的网页展示不友好,推荐你改变veiwport默认配置&…