基于内容的推荐

隐语义模型(LFM)

推荐系统_02

图形解释:
推荐系统_02

LFM的前生今世

  • 源于对svd(奇异值分解)方法的改进。
  • svd可用于推荐系统评分矩阵补全,但由于计算量太大,实际上只适用于规模很小的系统。

隐语义模型的适用性

  • 分类数k是先验指定,可以通过k控制分类的粒度
  • LFM中,商品针对每个类都可以计算权重,是天生的多分类,多纬度

关于训练集

基本概念:

  • 显性数据:数据集包含u用户对i商品的打分,有用户编号和商品编号。
  • 隐形数据:购物篮数据,点击的商品等
  • 正样本:喜欢的商品
  • 负样本:不感兴趣的商品

那么如何产生负样本呢?
推荐系统_02

负样本的选择(小结)

  • 对每个用户,要保证正负用户的平衡
  • 对每个用户采样负样本时,要选取哪些很热门,而用户却没有行为的物品(因为很可能注意到了却没有行为)

如何计算权重

  • 最大似然法(类似于训练贝叶斯信念网络和EM算法)
  • 转化为求解损失函数极小值的问题

推荐系统_02

如何求解C的极小值
算法原理:
推荐系统_02

利用梯度下降法求极值(参考代码):

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()

相关文章: