week20因子分解机与协同过滤

547 阅读3分钟

FM算法的原理

FM全称为Factor Machine,中文翻译为因子分解机。

FM表达式为:

首先是特征组合,通过对两两特征组合,引入交叉项特征(即表达式中最后一项),使得稀疏数据下学习不充分的问题得以解决。比如原本的多项式回归的参数w12w12的学习只能依赖于特征x1x1和x2x2;而对参数⟨v1,v2⟩⟨v1,v2⟩而言就完全不一样了,它由v1v1和v2v2组成。而对于每个向量可以通过多个交叉组合特征学习得到,比如可以由x1x2,x1x3,…x1x2,x1x3,…学习获得,这样可供学习的非零样本就大大增加了。

其次是高维灾难,通过引入隐向量(对参数矩阵进行矩阵分解)隐向量的点积可以表示原本两个毫无相关的参数之间的关系,使参数的数量大幅度缩减,从n×(n−1)/2降低到nk,完成对特征的参数估计。

FM算法的计算复杂度

两两交叉的复杂度应该O(k*n^2)吧,其实,通过数学公式的巧妙转化一下,就可以变成O(kn)了。转化公式如下所示,其实就是利用了2xy = (x+y)^2 – x^2 – y^2的思路。

FFM算法的原理

Field-aware Factorization Machines for CTR Prediction

www.csie.ntu.edu.tw/~cjlin/pape…

通过引入field的概念,FFM把相同性质的特征归于同一个field,比如“Day=26/11/15”、“Day=1/7/14”、“Day=19/2/15”这三个特征代表日期,放到同一个field中

当“Day=26/11/15”与Country特征,Ad_type特征进行特征组合时,使用不同的隐向量(Field-aware),这是因为Country特征和Ad_type特征,本身的field不同

DeepFM算法的原理

DeepFM: A Factorization-Machine based Neural Network for CTR Prediction,2017

arxiv.org/abs/1703.04…

FM可以做特征组合,但是计算量大,一般只考虑2阶特征组合

如何既考虑低阶(1阶+2阶),又能考虑到高阶特征 => DeepFM=FM+DNN

设计了一种end-to-end的模型结构 => 无须特征工程

在各种benchmark和工程中效果好

Libfm

下载地址:github.com/srendle/lib…

使用文档:www.libfm.org/libfm-1.42.…

FM论文作者Steffen Rendle提供的工具(2010年)

在KDD CUP 2012,以及Music Hackathon中都取得不错的成绩

不仅适用于推荐系统,还可以用于机器学习(分类问题)

实现三种优化算法:SGD,ALS,MCMC

支持2种输入数据格式:文本格式(推荐)和二进制格式

Libffm

libFFM

github.com/ycjuan/libf…

提供Python接口

支持LR,FM,FFM算法等

运行效率高,比libfm, libffm快

Xlearn

xlearn

xlearn-doc-cn.readthedocs.io/en/latest/i…

提供Python接口

支持LR,FM,FFM算法等

运行效率高,比libfm, libffm快

Deepctr

github.com/shenweichen…

实现了多种CTR深度模型

与Tensorflow 1.4和2.0兼容

基于邻域的协同过滤 UserCF,ItemCF

协同过滤是推荐系统的经典算法之一

基于邻域的协同过滤(neighborhood-based)

UserCF:给用户推荐和他兴趣相似的其他用户喜欢的物品

ItemCF:给用户推荐和他之前喜欢的物品相似的物品

相似邻居的定义

固定数量的邻居K-neighborhoods

不论距离原理,只取固定的K个最近的邻居

k-Nearest Neighbor,KNN

基于相似度门槛的邻居,落在以当前点为中心,距离为 K 的区域中的所有点都作为邻居

相似度计算的方式

• 相似度计算方式,默认为MSD,也可设置为cosine,pearson,pearson_baseline

• min_support,最小支持度,对用户或者商品进行筛选

• shrinkage:收缩参数(仅与Pearson correlation相似度相关)。 默认值为100

Surprise工具中的基于邻域的协同过滤算法使用