推荐系统中的矩阵分解演变方式

推荐算法主要分为基于内容的算法和协同过滤. 协同过滤的两种基本方法是基于邻居的方法(基于内容/物品的协同过滤)和隐语义模型. 矩阵分解乃是实现隐语义模型的基石.

矩阵分解依据用户对物品的评分, 判断出用户和物品的隐语义向量, 然后依据用户和物品的隐语义向量来进行推荐.

推荐系统用到的数据能够有显式评分和隐式评分. 显式评分时用户对物品的打分, 显式评分矩阵通常很稀疏. 隐式评分是指用户的浏览, 购买, 搜索等历史记录, 表示的是用户行为的有无, 所以是一个密集矩阵.

1. 基本矩阵分解


矩阵分解方法会将用户和物品映射到f维的隐向量空间, 用户对物品的评分表示为两个向量的内积. 亦即, 每一个物品i表示为向量q_i\in\mathbb{R}^f, 每一个用户表示成向量p_u\in\mathbb{R}^f. 对于物品i, 向量q_i的元素表示的是物品i具有这些隐因子的程度, 对于用户u, 向量p_u表示的是用户对各个隐因子的兴趣, 元素的值可正可负. 两个向量的内积

\hat{r_{ui}}=q_i^Tp_u\tag{1}

表示的就是预计的用户对物品的评分. 所以基本的挑战就是计算用户和物品到隐向量的映射.

最简单的就是神秘值分解(Singular value decomposition, SVD), 使用SVD须要分解用户物品评分矩阵, 可是通常该矩阵中有非常多值是缺失的, 这样的情况下的SVD是不可行的. 另外, 仅仅处理已知的这些评分easy导致过拟合. 能够通过填充数据来使得矩阵变得稠密, 可是填充数据的准确性非常是问题.

最主流的做法是仅仅对那些已观測到的评分进行建模, 而且通过使用正则化项来避免过拟合, 亦即求解下面问题:

\min_{q, p}\sum_{(u,i)\in\mathcal{k}}(r_{ui}-q_i^Tp_u)^2 + \lambda(\|p_u\|^2 + \|q_i\|^2)\tag{2}

当中\mathcal{k}是所以已知评分的用户-物品对, \lambda控制着正则化的程度.

2. 学习算法


两种经常使用的求解上式的算法为随机梯度下降(SGD)和ALS(Alternating Least Square).

2.1 随机梯度下降


对于每一个用户-物品评分, 计算预測误差

e_{ui} = r_{ui} - q_i^Tp_u

然后依照梯度下降的方向更新用户和物品的隐向量:

q_i \leftarrow q_i + \gamma\cdot(e_{ui}\cdotp_{u}-\lambda\cdot q_i)

p_u \leftarrow p_u + \gamma\cdot(e_{ui}\cdot q_{i}-\lambda\cdotp_u)

2.2 ALS(Alternating Least Square)


由于p_uq_i都是未知的, 所以公式2不是凸的. 可是, 当我们固定当中一个变量, 则2式变成一个二次函数, 可以被最优的求解. 所以ALS算法的思想就是交替的固定p_uq_i, 然后求解另外一个变量的二次函数的最优值.

通常SGD都会比ALS要简单并且高速, 可是ALS的并行性比較好, 并且能够较好地处理稀疏数据(?).

3. 加入偏置项


矩阵分解方法的一个优点就是能够灵活的加入很多面向应用的要求. 比方, 通常来说, 不同用户的评分倾向不同, 用的用户的打分普遍较高, 有的普遍较低, 物品亦然. 所以只使用用户和物品之间的交互q_i^Tp_u来对评分进行建模不是非常好, 还须要加上一些偏置项. 一种一阶偏置项近似为:

b_{ui}=\mu+b_i+b_u

当中\mu描写叙述的是全部评分的平均值, b_u, b_i描写叙述的是用户和物品相对于\mu的偏差.

评分模型为:

\hat{r_{ui}}=\mu + b_i | b_u + q_i^Tp_u

转化为最优化问题为:

\min_{p\cdot,q\cdot,b\cdot}\sum_{(u,i)\in\mathcal{k}}(r_{ui}-\mu-b_u-b_i-p_u^Tq_i)^2 + \lambda(\|p_u\|^2 + \|q_i\|^2 +b_u^2+ b_i^2)

4. 其它的输入源


当解决冷启动问题时, 用户的评分信息非常少, 这时候就须要使用用户的其它输入信息, 比方用户隐式反馈(浏览, 购买历史等). 令N(u)表示用户有隐反馈的物品. 系统能够通过这些物品来对用户建模, 亦即把每一个物品表示成一个隐向量x_i\in\mathbb{R}^f, 则用户能够通过下式来描写叙述:

\sum_{i\in N(u)}x_i

能够对上式进行正则化:

|N(u)|^{-0.5}\sum_{i\in N(u)}x_i

也能够使用用户的一些其它属性(性别, 年龄, 收入等)来对用户建模, 令A_u表示用户的一些布尔属性,则隐向量y_{a}\in\mathbb{R}^f表示用户的某个属性, 用户的全部属性能够通过下式来描写叙述:

\sum_{a\in A(u)}y_a

用户对物品的评分能够表示为:

\hat{r_{ui}}=\mu + b_i | b_u + q_i^T[p_u + |N(u)|^{-0.5}\sum_{i\in N(u)}x_i +\sum_{a\in A(u)}y_a]

5. 时间因素


到如今为止, 模型是静态的, 可是实际中物品的流行程度会随着时间变化, 用户的评分倾向也会变化, 用户的隐向量也会随时间变化. 所以能够将这些变量表示成时间的函数来更好地描写叙述这些现象:

\hat{r}_{ui}=\mu + b_i(t) + b_u(t) + q_i^Tp_u(t)

6. 不同可信度的输入源


不同的评分的可信度不同. 比方广告会影响某个物品的评分, 另外, 有些作弊的用户会对某些物品恶意的打高分或者低分. 另外, 在使用隐式反馈时, 能够使用某些行为(比方浏览)等得次数来表示用户喜欢某个物品的程度. 能够通过为某个评分r_{ui}设置权重c_{ui}来解决上述问题:

\min_{p\cdot,q\cdot,b\cdot}\sum_{(u,i)\in\mathcal{k}}(c_{ui}(r_{ui}-\mu-b_u-b_i-p_u^Tq_i)^2 + \lambda(\|p_u\|^2 + \|q_i\|^2 +b_u^2+ b_i^2)

 

參考文献:

[1]. Yuhuda Koren, Robert Bell and Chris Volinsky. Matrix Factorization Techniques for Recommender Systems.

转载于:https://www.cnblogs.com/jhcelue/p/7235020.html

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

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

相关文章

mysql1846错误_MySQL 错误代码:2003 idea错误:ERROR DruidDataSource:1846 - create connection error...

idea项目一启动就报错:20:01:13,047 ERROR DruidDataSource:1846 - create connection errorcom.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The…

mac刷新本地DNS缓存

本地连网有问题,刷新本地dns缓存,刷新DNS缓存命令 sudo killall -HUP mDNSResponder

HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)

HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 文章来源:http://www.cnblogs.com/beatIteWeNerverGiveUp/p/5709841.html ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递…

Java中Class.forName和 ClassLoader.loadClass()区别

一、类加载过程 装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象; 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选…

变量在内存中的值[c][code]

#include <stdio.h>main() { /*%d所能输出的范围*/printf("%d \n", 0xffffffff); //%d所能输出的32位整数, 最大负整数printf("%d \n", 0x7fffffff); //%d所能输出的32位整数, 最大正整数/*单双精度浮点变量a,b,c,d在内存中的地址和内容 * …

Servlet 生命周期

Servlet 生命周期&#xff1a;Servlet 加载--->实例化--->服务--->销毁。init&#xff08;&#xff09;&#xff1a;在Servlet的生命周期中&#xff0c;仅执行一次init()方法。它是在服务器装入Servlet时执行的&#xff0c;负责初始化Servlet对象。可以配置服务器&…

java mysql防重复提交_防止数据重复提交的6种方法(超简单)!

有位朋友&#xff0c;某天突然问磊哥&#xff1a;在 Java 中&#xff0c;防止重复提交最简单的方案是什么&#xff1f;这句话中包含了两个关键信息&#xff0c;第一&#xff1a;防止重复提交&#xff1b;第二&#xff1a;最简单。于是磊哥问他&#xff0c;是单机环境还是分布式…

HttpRequest 类

关于此类的介绍&#xff1a;查看HttpRequest类 点击查看&#xff1a;HttpRequest中方法的封装 跟这个类对应的HttpResponse类 定义&#xff1a;使 ASP.NET 能够读取客户端在 Web 请求期间发送的 HTTP 值。 public sealed class HttpRequest 注&#xff1a;本篇主要介绍可以根据…

java中的HashSet内部是如何工作的

HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value&#xff0c;所以HashSet中所有 key 的都有一个默认 value。 类似于HashMap&#xff0c;HashSet 不允许重复的 key&#xff0c;只允许有一个null key&#xff0c;意思就是 HashSet 中只允许存储一个 null 对象。…

python字符串函数运算_Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】 原创...

前面简单介绍了python基本运算&#xff0c;这里再来简单讲述一下Python字符串相关操作1. 字符串表示方法 >>> "www.jb51.net" #字符串使用单引号()或双引号(")表示www.jb51.net>>> www.jb51.netwww.jb51.net>>> "www."&qu…

自定义报表预览控制工具条

说明&#xff1a;原有的VFP的打印预览用多了感觉真的不是很方便&#xff0c;在某些特定的要求下&#xff0c;她就显得很笨拙&#xff0c;尤其那个打印工具条上的打印机按纽&#xff0c;一点就打印了&#xff0c;有时候我们需要在那个时候进行有选择性的打印而不是全盘的打出来&…

Struts2结果跳转方式

1.转发 <!-- 转发 --> <action name"Demo1Action" class"cn.itheima.a_result.Demo1Action" method"execute" ><result name"success" type"dispatcher" >/hello.jsp</result> </action> 2.…

mysql gid_mysql主从复制5.6基于GID及多线程的复制笔记

mysql:数据库复制过滤#show grobal variables like binlog%;注意&#xff1a;不能在主服务器上做过滤&#xff0c;二进制不完整性&#xff1b;它将危害到其他的数据库&#xff1b;在从库过滤会占用过多的带宽,还会复制过多的跟数据库无关的内容主端:binlog-do-db:仅将指定数据库…

TreeMap是按照key的字典顺序来排序

一、TreeMap TreeMap 默认排序规则&#xff1a;按照key的字典顺序来排序&#xff08;升序&#xff09; 字典排序&#xff08;lexicographical order&#xff09;是一种对于随机变量形成序列的排序方法。即按照字母顺序&#xff0c;或者数字小大顺序&#xff0c;由小到大的形成…

Fireflow 终于发布啦!

Fireflow终于发布啦。虽然离工程应用还有一段距离&#xff0c;但是我还是想放出来让大家看看&#xff0c;听听大家的意见和建议。Fireflow的特点是模型和engine理论严密&#xff0c;因此可以在设计器中模拟流程的执行。另外Fireflow的系统设计也还可以的~_^文档还很欠缺&#x…

C语言攻略指南(五)数组篇

数组是指那些具有相同的数据类型的&#xff0c;数量有限的若干个变量通过有序的方法组织起来的一样种便于使用的形式。数组属于派生类型&#xff08;数组是建立在其他类型的基础上&#xff09;&#xff0c;数组中的变量被称为数组的元素。 一维数组 一维数组指的是只有一个下标…

java 虚类_java虚方法

java虚方法我们已经讨论了方法的重载&#xff0c;也就是子类能够重载父类的方法。以下是小编为大家搜索整理的java虚方法&#xff0c;欢迎大家阅读!更多精彩内容请及时关注我们应届毕业生考试网!当子类对象调用重载的方法时&#xff0c;调用的是子类的方法&#xff0c;而不是父…

windows下快速启动或关闭系统服务方法

在windows下有些后台服务会开机自动启动。 用命令行方式启动关闭应用服务 使用sc.exe命令功能列表 修改服务启动类型的命令行格式为&#xff08;特别注意start后面有一个空格&#xff09;    sc config 服务名称 start demand(设置服务为手动启动)     sc config 服务名…

我为什么fuck GFW同时FUCK 开心网

我很生气&#xff0c;后果很严重&#xff0c;你要问我为什么&#xff0c;那是因为GFW 屏蔽了一个对我有用的站点[url]www.github.com[/url]&#xff0c; 什么玩意&#xff08;省略1亿遍fuck 他们的话&#xff09;。 开心网删除我的日记&#xff0c; 并没用通知过我&#xff0c…