隐语义模型(LFM)
图形解释:
LFM的前生今世
- 源于对svd(奇异值分解)方法的改进。
- svd可用于推荐系统评分矩阵补全,但由于计算量太大,实际上只适用于规模很小的系统。
隐语义模型的适用性
- 分类数k是先验指定,可以通过k控制分类的粒度
- LFM中,商品针对每个类都可以计算权重,是天生的多分类,多纬度
关于训练集
基本概念:
- 显性数据:数据集包含u用户对i商品的打分,有用户编号和商品编号。
- 隐形数据:购物篮数据,点击的商品等
- 正样本:喜欢的商品
- 负样本:不感兴趣的商品
那么如何产生负样本呢?
负样本的选择(小结)
- 对每个用户,要保证正负用户的平衡
- 对每个用户采样负样本时,要选取哪些很热门,而用户却没有行为的物品(因为很可能注意到了却没有行为)
如何计算权重
- 最大似然法(类似于训练贝叶斯信念网络和EM算法)
- 转化为求解损失函数极小值的问题
负样本采样过程(代码):
如何求解C的极小值
算法原理:
利用梯度下降法求极值(参考代码):
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
#原函数
def Fun(x,y):
return x-y+2*x*x+2*x*y+y*y
#偏x导
def PxFun(x,y):
return 1+4*x+2*y
#偏y导
def PyFun(x,y):
return -1+2*x+2*y
#初始化
#figure对象
fig=plt.figure()
#Axes3D对象
ax=Axes3D(fig)
#取样并作满射联合
X,Y=np.mgrid[-2:2:40j,-2:2:40j]
#取样点Z坐标打表
Z=Fun(X,Y)
ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap="rainbow")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
#梯度下降
#下降系数
step=0.0008
#初始选取一个点
x=0
y=0
tag_x=[x]
tag_y=[y]
#三个坐标分别打入表中,该表用于绘制点
tag_z=[Fun(x,y)]
new_x=x
new_y=y
Over=False
while Over==False:
#分别作梯度下降
new_x-=step*PxFun(x,y)
new_y-=step*PyFun(x,y)
#精度
if Fun(x,y)-Fun(new_x,new_y)<7e-9:
Over=True
#更新旧点
x=new_x
y=new_y
tag_x.append(x)
tag_y.append(y)
#新点三个坐标打入表中
tag_z.append(Fun(x,y))
#绘制点/输出坐标
ax.plot(tag_x,tag_y,tag_z,'r.')
plt.title('(x,y)~('+str(x)+","+str(y)+')')
plt.show()
LFM中的重要参数(如何调参)
- 模型中隐特征个数(隐分类的分类数,依赖于经验和尝试)
- 梯度下降法中选取的学习速率(快容易引起震荡,慢容易导致计算速度慢)
- 损失函数中惩罚项系数 λ \lambda λ(越大越抑制过拟合)
- 训练集的负样本/正样本比例ratio
使用movielens数据集验证LFM有效性
movielens网址:https://grouplens.org/datasets/movielens/
验证结果:
Netflix大奖赛
Netflix是一家在线影片租赁提供商。公司能够提供超大数量的DVD,而且能够让顾客快速方便的挑选影片,同时免费递送。大奖赛对推荐系统算法发展有深远影响,比如对LFM的追捧使其快速进入大众规野,对LFM提出了很多改进方法
正负样本比例参数ratio的影响
随着负样本数目的增加,LFM的准确率和召回率有明显提高,不过当ratio>10后,准确率和召回率基本上就比较稳定了。同时,随着负样本数目的增加,覆盖率不断降低,而推荐结果的流行度不断增加,说明ratio参数控制了推荐算法发掘长尾的能力。注意:当数据集非常稀疏时,LMF的性能会明显下降,甚至不如UserCF和ItemCF。
补充:几种指标
项亮书:p40
- 召回率
- 准确率
- 覆盖度
LFM的优缺点
- 典型的机器学习算法,有比较好的数学理论基础(优点)
- 指标一般会稍微高于ItemCF和UserCF
- 训练过程中占用较少内存(因为没有大规模矩阵运算)
- 由于需要迭代,计算时间要多于ItemCF和UserCF
- 不能在线实时计算
- 难以向用家解释模型的合理性
改进LFM
项亮书第八章
加入偏置项后的LFM公式:
- μ \mu μ:训练集中所有记录的评分的全局平均数(减少最高最低的影响)
- b u b_{u} bu:用户偏置(user bias)项(这一项表示了用户的评分习惯中和物品没有关系的那种因素,不如有的用户就喜欢打低分)
- b i b_{i} bi:物品偏置(item bias)项(这一项表示了物品接受的评分中和用户没有什么关系的因素,比如商品本来就好)
考虑领域影响的LFM
更像是ItemCF的变形。相当于svd的加强版,也称为svd++。
将时间变量加入模型
考虑用户兴趣会随着时间改变
模型组合
- 模型级联融合
- 模型加权融合