隐语义模型=Funk-SVD算法
1 矩阵P、Q、R
评分矩阵R分解成两个矩阵相乘(用户、物品隐表示矩阵P和Q)
给定F,是隐含的类别数,维度
矩阵R m×n m个用户 n个评分
矩阵P m×f 一行代表一个用户
矩阵Q f×n 一列代表一个物品
注:参考有的说明是P和Q都是m×f n×f 或者 f×m f×n,然后其中一个转置,其实含义都一样
r_ui=p_u1*q_i1+p_u2*q_i2+…+p_uf*q_if
2 损失函数
用户u对电影i的预测评分是
防止过拟合,加入正则化
3 随机梯度下降求解
①求导
比如3个维度f
p1 p2 p3 q1 q2 q3
前半部分 对p1求导 只有q1参数会×p1
②求导
③梯度下降多次
)
4 代码
#初始化P Q P和Q都是F×个数
def init(train_data,test_data,F):
sample_data=train_data.append(test_data,sort=False)
users=list(set(sample_data['UserID']))
movies=list(set(sample_data['MovieID']))
users.sort()
movies.sort()
#R=pd.DataFrame(data=None,index=users,columns=movies)
#for index,item in train_data.iterrows():
# R.loc[item['UserID']][item['MovieID']]=item['Rating']
P=pd