推荐系统算法(传统推荐模型)

推荐系统经历两个阶段:传统推荐模型和深度学习模型

第一阶段:传统推荐模型(协同过滤,矩阵分解,LR, FM, FFM, GBDT)。

  • 协同过滤体现了最朴素的推荐思想,同类相聚
  • 矩阵分解降低了计算复杂度
  • LR:用一层逻辑回归代替矩阵分解,预估CTR
  • FM:在LR的基础上,考虑特征组合
  • FFM:在考虑特征组合的基础上,更精细化的分不同的域做特征组合

1 召回侧或者粗排侧

1.1 基于内容的过滤算法

  • 简介:通过分析用户的历史行为给用户的兴趣建模,从而主动给用户推荐能够满足他们兴趣和需求的信息。
  • 本质:基于物品和用户的特征直接分析和计算。举个例子,假设电影A是科幻片,我们分析用户B看过的电影里有科幻片的tag,就可以推荐电影A给用户B。
  • 整体流程:
    (1)给电影打tag:从影评中切词,或者根据常用标签,得到电影的多个标签。再求每个标签的TF-IDF(Term Frequency - Inverse Document Frequency)值来计算标签权重,取Top-K个作为电影标签
    (2)建立倒排索引:可以根据关键词找到对应电影
    (3)给用户打tag:根据用户历史观影记录,找到看过的所有电影对应的关键词,统计词频,把词频最高的关键词作为用户的兴趣词
    (4)根据用户的兴趣词,从倒排表里找电影。实时推荐
  • 用到的技术:TF-IDF特征提取技术
    w_{ij} = TF_{ij}·IDF_i = \frac {f_{ij}}{f_{dj}} ·\log(\frac {N}{n_i})
  • 冷启动问题:对于一个新电影,用户都没有看过,无标签,通过两种技术来推荐新电影:
    (1)Word2Vec:得到的电影标签的词vector,来计算标签tag之间的相似性,推荐和用户看过的电影标签相似的电影给用户。用word embedding 的原因是如果标签词典太大,one-hot的representation维度太大,而word embedding可以用较小的维度
    (2)Doc2Vec:根据电影的所有标签,训一个模型得到最终电影的影片vector
  • 优点:一种比较简单的推荐方法,很直接,可解释性强
  • 缺点:需要用到物品本身或者是用户自身属性
from gensim.models import Word2Vec, Doc2Vec

协同过滤算法

  • 简介:对业界影响力最大,应用最广泛的一种经典模型,从1992年用到现在还在用。
  • 本质:
    (1)基于用户的系统过滤算法(UserCF):给用户推荐 和他兴趣相似的其他用户喜欢的物品
    (2)基于物品的协同过滤算法(ItemCF):给用户推荐 和他之前喜欢的物品相似的物品
  • 整体流程:
    (1)UserCF:先量化为猜测用户对一个商品喜爱程度的打分,根据之前用户购买、收藏、加购物车等行为对之前的商品分别打分,找到相似的用户,根据这些相似用户对新物品的打分,猜测该用户的打分,比较高就推荐,不高就不推荐。最后计算该用户的【相似用户们】对这个新商品的评价加权,得到该用户的评价预估。最好还可以用皮尔逊,减去每个用户的平均评分,这样消除不同用户打分标准不一致的问题
    (2)ItemCF:根据所有用户的历史偏好数据计算物品相似性,如果很多用户同时喜欢物品A和物品B,说明这俩很相似。用皮尔逊相关系数
  • 用到的技术:相似性计算
    (1)杰卡德(Jaccard)相似系数:衡量两个集合的相似程度,看交集在并集中占的比例。 J(A, B) = \frac {A \cap B}{A \cup B}
    (2)余弦相似度:衡量两个向量的夹角大小,越小相似度越大。 sim(i, j) = cos(i, j) = \frac {i·j}{\Vert i \Vert · \Vert i \Vert} 或者 cos(\theta) = \frac {\sum_{k=1}^{n}x_{1k}x_{2k}}{\sqrt{\sum_{k=1}^{n}x_{1k}^2} \sqrt{\sum_{k=1}^{n}x_{2k}^2}}
from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity([[1,2,3], [4,5,6]])

(3)皮尔逊(person)相关系数:当用户容易乱打分的时候(比如用户A喜欢打高分,用户B喜欢打低分),用余弦效果就不那么好了。person就是把两个向量都减去他们的均值,然后再计算consine,效果好于直接计算consine。 sim(i, j) = \frac {\sum_{p\epsilon P}(R_{i,p} - \overline{R}_i)(R_{j,p} - \overline{R}_j)}{\sqrt{\sum_{p\epsilon P}(R_{i,p} - \overline{R}_i)^2} \sqrt{\sum_{p\epsilon P}(R_{j,p} - \overline{R}_j)^2}}

from scipy.stats import pearsonr
pearsonr([[1,2,3],[4,5,6]])
  • 其他:为什么在一些场景中要使用余弦相似度而不是欧式距离呢?
    (1)一些在欧式距离中非常大,在余弦中夹角非常小的,比如文本、图像、视频领域的特征维度非常高,但余弦相似度不仅不受值域影响,而且范围都是在同向为1,正交为0,反向为-1的特性。
    (2)比如统计用户观看偏好,更关注相对差异,应该用余弦。
    (3)比如统计用户活跃度,登录次数和平均观看时长,关注数值绝对差异,应该用欧式距离。
  • 优点:完全没有用到物品本身或者是用户自身属性,仅仅根据用户和物品的交互信息就可以实现推荐,可解释性很强,非常直观
    (1)UserCF 是基于用户相似度进行推荐, 所以具备更强的社交特性, 这样的特点非常适于用户少, 物品多, 时效性较强的场合, 比如新闻推荐场景
    (2)ItemCF更适用于兴趣变化较为稳定的应用, 更接近于个性化的推荐, 适合物品少,用户多,用户兴趣固定持久, 物品更新速度不是太快的场合, 比如推荐艺术品, 音乐, 电影。
  • 缺点:稀疏矩阵的处理能力比较弱(热门物品有较强的头部效应,很容易跟大量物品产生相似,但尾部物品由于特征向量稀疏,极少被推荐),且无法利用更多信息比如物品的特征,这就是为什么协同过滤慢慢烟花到了逻辑回归模型,可以综合不同类似特征。UserCF存在数据稀疏性和算法扩展性的问题,ItemCF相对来说因为物品属性比较固定,所以相似度比较稳定。


    CF的地位

隐语义模型(LFM)与矩阵分解(MF)

  • 简介:矩阵分解(Matrix Factorization)是从协同过滤中衍生出的方向,用于解决处理稀疏矩阵的泛化能力,比如隐语义模型(Latent Factor Model)等,就是这个方向的分支模型。就是在协同过滤共现矩阵的基础上,使用更稠密的隐向量(类似NLP里的embedding)表示用户和物品,挖掘用户和物品的隐含兴趣和隐含特征,解决泛化能力。
  • 本质:把协同过滤的评分矩阵,分解成了用户矩阵乘以物品矩阵,这俩矩阵都是隐向量。预测新物品评分的时候,直接用物品向量乘以用户向量即可。为了拆解这两个矩阵,出现了很多算法(BasicSVD,RSVD,ASVD,SVD++)
  • 整体流程:共现矩阵R(mxn维度),分解成用户矩阵U(mxk维度)和物品矩阵V(kxn维度)。后续如果想知道用户u对物品i的评分,只需要
    Preference(u,i) = r_{ui} = p_u^Tq_i = \sum_{f=1}^{F}p_{u,k}q_{k,i}
  • 用到的技术:矩阵分解最常用的方法是特征值分解(EVD)或者奇异值分解(SVD)
    (1)特征值分解EVD:要求分解的是方阵,不适用
    (2)奇异值分解SVD:可以用满秩分解对数据做压缩,但是计算复杂度高
    (3)BasicSVD:2006年的Netflix Prize之后, Simon Funk公布了一个矩阵分解算法叫做Funk-SVD,后来被称为Latent Factor Model(LFM)。思想很简单:把求解两个矩阵的问题转换成一个最优化问题,先随机初始化,然后通过和观测值的误差loss最小化,就可以用梯度下降法训练了。问题就在于两个矩阵很大的时候,参数量过多,容易陷入过拟合
    (4)RSVD:在目标函数中加入正则化参数(加入惩罚项目),避免过拟合
    (5)Netfix Prize中提出了另一种LFM:消除用户和物品打分的偏差。因为单纯根据两个隐向量的距离来打分是不够的,所以直接加上几个偏置项目:① 全局平均数,②用户偏差系数,③物品偏差系数。这样得到的隐向量更能反映不同用户对不同物品的“真实”态度差异
    (6)SVD++:把历史评分的物品加入到LFM模型中
  • 其他:隐语义模型LDM和矩阵分解FM是试图在协同过滤共现矩阵的基础上,使用更加稠密的的印象量表示用户和物品,挖掘用户和物品的隐含兴趣和隐含特征,在一定程度上弥补协同过滤模型处理稀疏矩阵能力不足的问题。
  • 优点:泛化能力强可解决稀疏问题,空间复杂度低,更好的扩展和灵活性
  • 缺点:只用到了评分矩阵,没有考虑用户、物品、上下文的特征,丧失了很多有效信息的,也很难考虑用户历史行为(所以后续有逻辑回归和因子分解机模型)。

FM+FFM 模型

  • 简介:FM(因子分解机 Factorization Machine)FFM(域感知因子分解机 Field-aware Factorization Machine)这两个因子分解机模型族,在传统逻辑回归的基础上,加入了二阶的部分,使得模型具备了特征交叉和筛选的能力。用来解决逻辑回归模型(LR模型已经把TopK的问题转成了CTR预估的问题)里表达能力不强的问题。(除了POLY2->FM->FFM这条发展线路之外,还有另外一条发展线路是GBDT+LR)
  • 本质:就是希望在LR的基础上,能考虑特征组合,毕竟LR就是粗暴的做线性组合再过一层sigmod。(考虑特征组合的线路:POLY2->FM->FFM)
    (1)POLY2:直接做暴力组合,对所有的特征进行两两交叉。从LR的y=w_0+\sum_{i=1}^nw_ix_i变成y=w_0+\sum_{i=0}^nw_ix_i+\sum_{i=1}^{n-1}\sum_{i+1}^nw_{ij}x_ix_j。缺点:①会导致特征向量非常稀疏,交叉特征可能会缺乏有效数据训练;②权重参数量是(n-1)n/2太大了
    (2)FM:结合LFM的思想,用隐向量替换one-hot向量,即把w_{ij}替换成两个隐向量<w_i,w_j>相乘的方式y=w_0+\sum_{i=0}^nw_ix_i+\sum_{i=1}^{n-1}\sum_{i+1}^n<v_i,v_j>x_ix_j,一方面减少了模型参数数量,另一方面参数之间不再是相互独立的,可以减轻数据稀疏性造成的影响。另一方面,FM可以用SGD训练,可以在线性时间内训练和预测

    (3)FFM:相比较FM,FFM引入了特征域感知的概念,对于每个特征, 针对不同的交叉域要学习不同的隐向量特征,好处是交叉的时候, 可以更能够体现出不同域里面特征的差异性。
  • 整体流程:比如一个日期和年龄特征分别有3个域的embedding,如果要计算日期特征和年龄的交叉特征,首先要看年龄属于哪个域,再用那个域的embedding来相乘得到最后的交叉特征。时间复杂度上会从FM的O(nk)到FFM的O(nfk), 这里的f就是域的个数, 这里的时间复杂度会到O(kn^2)。
  • 用到的技术:
  • 其他:工业上, 原始的FFM一般不会使用, 因为这哥们计算量太大了, 每个域都会学习特征, 这个与word2vec做个对比,那里每个单词只有两个身份, 这时候,对应了2个embedding矩阵, 而这里假设有100个域, 那么相当于每个实值特征有99个身份(会和其他99个域特征交叉), 这时候99个embedding矩阵, 而每个embedding矩阵维度就很大了, 这样的计算更新是受不了的。如果真想用,一般要做一些处理, 两个改进的思路:① 共享一些矩阵 ② 减少域的数量,大致分为上下文特征、用户特征、item特征、交互特征和匹配特征 五大类,就可以只有5个embedding矩阵了
  • 优点:可以体现不同域特征里的差异性
  • 缺点:计算量太大,所以工业界一般不用FFM(无论是召回还是排序),但FM还是首选

参考:https://blog.csdn.net/wuzhongqiang/category_10128687.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容