协同过滤 collaborative filtering

人以类聚,物以群分

相似度

1. Jaccard 相似度

定义为两个集合的交并比:

Jaccard 距离,定义为 1 - J(A, B),衡量两个集合的区分度:

为什么 Jaccard 不适合协同过滤?—— 只考虑用户有没有看过,没考虑评分大小

2. 余弦相似度

根据两个向量夹角的余弦值来衡量相似度:

为什么余弦相似度不适合协同过滤?—— 不同用户各自评分总和不一样,导致评分占总比不一样,可能计算出和事实相反的结果。

3. Pearson 相似度

解决余弦相似度中的相似度差异问题,又称中心余弦算法。先中心化,再算余弦相似度,这样正值表示正相关,负值表示负相关。

基于用户的协同过滤

通过用户对物品的喜爱程度进行度量和打分。根据不同用户对相同商品或内容的态度进行商品推荐。

举例说明,每个行向量表示某个用户对所有电影的评分

先把数据中心化

然后计算用户 A 和其他用户的 Pearson 相关系数:

可以发现用户 A 和用户 B 喜好接近,因此可以将 B 喜欢但 A 没看过的密室推荐给 A,同时也可以将 A 喜欢但 B 没看过的火焰杯推荐给 B。

用户法存在的问题:

  1. 数据稀疏性。物品太多,不同用户之间买的物品重叠性较低,导致无法找到一个偏好相似的用户

  2. 算法扩展性。最近邻算法的计算量随着用户和物品数量的增加而增加,不适合数据量大的情况使用。

基于物品的协同过滤

通过计算不同用户对于不同物品的评分,获得物品间的关系。基于物品间的关系对用户进行相似物品的推荐。

举例说明,每一个行向量表示某个物品被各个用户的评分,先中心化

如何预测用户 E 对 哈利波特的喜好程度?计算哈利波特和其他电影之间的 Pearson 相关系数

选择相关性较大的其他电影,拿出用户 E 对这些电影的评分,利用 Pearson 相关系数做 weighted sum:

从原理上看,基于用户或基于物品都是可以的,但实践中以物品为基础效果更好,且需要很少的数据就可以进行预测,用户法需要大量数据。

基于模型的协同过滤 

主流方法主要有以下几种。先占坑,慢慢补吧

1. 关联算法

Apriori,FP Tree 和 PrefixSpan

刘建平老师的博客:

Apriori算法原理总结

FP Tree算法原理总结

PrefixSpan算法原理总结 

2. 聚类

K-means,谱聚类, BIRCH 和 DBSCAN

之后自己总结一下 k-means 和谱聚类

BIRCH聚类算法原理

DBSCAN密度聚类算法

3. 矩阵分解

Matrix Factorization

要处理的数据样式

要先做 encoding,把 categorical features 转换为 numerical features。最简单就是 one-hot encoding,把 id 映射成 binary vector。

某个用户没看过的电影,评分就是空出来的。

用线性网络来预测评分的话,需要两个矩阵(两层的权重参数)。每一个 user 在隐含层的输出就相当于直接从 V 中查表。相当于做了一次映射、一次线性组合。

训练的目标函数呢?—— 均方误差呗

比较直接的想法就是,干脆把 R 矩阵分解成两个矩阵相乘的形式就好了。根据已有的评分来学习 W 和 V 的参数。

优化方法:

1. 目标函数如下所示,交替更新 W 和 V 的参数(如果把 R 转置,其实 W 和 V 从形式上就是对称的)。

这种优化方法叫做交替最小二乘,能得到局部最优解。

2.直接用 SGD,更有效率。

梯度公式:

优化过程:

SVD 协同过滤

奇异值矩阵的特征值按照从大到小排列且迅速减小,可以把大矩阵用三个小矩阵来近似描述,实现降维和去噪,应用于协同过滤中可以减少计算量。

用 K 维 SVD 分解做协同过滤,实际上就是找一组 latent variables,U 和 V 分别描述了物品与隐变量、用户与隐变量之间的关系。 然后就可以都在 latent space 中表示。

举例说明,4 个用户对 6 部电影的评分情况

做二维 SVD 分解:

在 latent space 中表示用户和电影,发现电影之间、用户之间、电影和用户之间,都可以衡量中心余弦相似度。

如果出现一个新用户,如何给他推荐他没有看过的电影?

把新用户投影到 latent space

找到和新用户相似度高的用户,把相似用户评分高而新用户没看过的电影,按相似用户的评分高低顺序先后推荐给新用户即可。

Factorization Machine

https://www.cnblogs.com/pinard/p/6370127.html

4. 分类算法

LR(可解释性强,便于做特征工程),朴素贝叶斯

GBDT

5. 回归算法

Ridge,  决策树,支持向量回归

6. 神经网络

YouTube Recommendation System 引出的一系列基于 NN 的推荐模型

7. 图模型

SimRank,马尔可夫模型

8. 隐语义模型

LSA,LDA

协同过滤 Collaborative Filtering的更多相关文章

  1. 25.推荐---协同过滤(Collaborative Filtering)

    协同过滤需要注意的三点: gray sheep(有人喜欢追求特别,协同过滤一般只能从共同的人或物间找相似) shilling attack(水军刷好评导致数据错误,无法带来精确的推荐) cold st ...

  2. 协同滤波 Collaborative filtering 《推荐系统实践》 第二章

    利用用户行为数据 简介: 用户在网站上最简单存在形式就是日志. 原始日志(raw log)------>会话日志(session log)-->展示日志或点击日志 用户行一般分为两种: 1 ...

  3. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  4. 【转载】协同过滤 & Spark机器学习实战

    因为协同过滤内容比较多,就新开一篇文章啦~~ 聚类和线性回归的实战,可以看:http://www.cnblogs.com/charlesblc/p/6159187.html 协同过滤实战,仍然参考:h ...

  5. Spark MLlib之协同过滤

    原文:http://blog.selfup.cn/1001.html 什么是协同过滤 协同过滤(Collaborative Filtering, 简称CF),wiki上的定义是:简单来说是利用某兴趣相 ...

  6. CF(协同过滤算法)

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  7. 机器学习相关——协同过滤

    在现今的推荐技术和算法中,最被大家广泛认可和采用的就是基于协同过滤的推荐方法.本文将带你深入了解协同过滤的秘密.下面直接进入正题 1 什么是协同过滤 协同过滤是利用集体智慧的一个典型方法.要理解什么是 ...

  8. Mahout之(二)协同过滤推荐

    协同过滤 —— Collaborative Filtering 协同过滤简单来说就是根据目标用户的行为特征,为他发现一个兴趣相投.拥有共同经验的群体,然后根据群体的喜好来为目标用户过滤可能感兴趣的内容 ...

  9. 协同过滤(CF)算法

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

随机推荐

  1. Maven快速入门(四)Maven中的pom.xml文件详解

    上一章,我们讲了Maven的坐标和仓库的概念,介绍了Maven是怎么通过坐标找到依赖的jar包的.同时也介绍了Maven的中央仓库.本地仓库.私服等概念及其作用.这些东西都是Maven最基本.最核心的 ...

  2. 今天来学习一下MySQl的 临时表,变量,行转列,预处理的一些相关技术的使用!

    先来简单了解一下MySQL数据库有意思的简介 MySQL这个名字,起源不是很明确.一个比较有影响的说法是,基本指南和大量的库和工具带有前缀“my”已经有10年以上, 而且不管怎样,MySQL AB创始 ...

  3. 没想到,Git居然有3种“后悔药”!

    没想到,Git居然有后悔药! 你知道Git版本控制系统中都有哪些"后悔药"吗? 本文通过案例讲解git reset . git revert . git checkout在版本控制 ...

  4. 【python】我OUT了,原来函数中的冒号和箭头是这么回事

    翻了翻httprunner的源代码,越看越不对劲,感觉有点看不懂语法了. 这都什么鬼?感觉心好慌,顿时感到惭愧万分,还好意思说自己了解Python呢. 赶紧了解一下,原来这叫 type hints,是 ...

  5. CVPR2020 面向密集多角度物体检测的动态修正网络(DRN)

    论文链接:https://arxiv.org/pdf/2005.09973.pdf code:https://github.com/Anymake/DRN_CVPR2020 文章概要: 本文是中科院自 ...

  6. 项目实战 - 原理讲解<-> Keras框架搭建Mtcnn人脸检测平台

    Mtcnn它是2016年中国科学院深圳研究院提出的用于人脸检测任务的多任务神经网络模型,该模型主要采用了三个级联的网络,采用候选框加分类器的思想,进行快速高效的人脸检测.这三个级联的网络分别是快速生成 ...

  7. 转载:Redis主从复制与高可用方案

    转载自: https://www.cnblogs.com/lizhaojun-ops/p/9447016.html 原文链接:http://gudaoyufu.com/?p=1230 redis主从复 ...

  8. URL 传参转义 (特殊符号转义)

    问题: url参数中 存在+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好? 解决办法:将这些字符转化成服务器可以识别的字符,对应关系如下:URL ...

  9. ParticleSystem的小优化

    最近游戏场景希望加入一些ParticleSystem来丰富场景,这样肯定会带来一定的性能开销.一般来说ParticleSystem的优化就是尽量减少粒子数,尽量不使用粒子碰撞等.而今天要说的是,多个P ...

  10. python中一次性input3个整数,并用空格隔开怎么表示

    a,b,c=map(int,input('请输入3个整数用空格隔开:').split(' ')) map的使用方法:map(函数名,循环体)