基于内容的推荐
隐语义模型(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()