说明
SVD在进行用户i对商品j的评分时,考虑了用户特征向量和商品特征向量,以及评分相对于平均评分的偏置向量。
数据在https://pan.baidu.com/s/1sQsHUgL__kwWAghe7TvMZA 提取码:18bz
代码
# -*- coding: utf-8 -*-
import numpy as np
import time
import pickle
class SVD(object):
"""
核心是:SVD在进行用户i对商品j的评分时,考虑了用户特征向量和商品特征向量,以及评分相对于平均评分的偏置向量。
发现跟 LFM算法基本是一致的,核心就是下面的式子, 也是通过一定的计算来模拟构建 兴趣矩阵,只不过这里构建矩阵时,要考虑的参数
包括 U 矩阵参数、M矩阵参数 、bu 、bi 这几种参数,其他都是差不多, 其余就是通过构建兴趣预估后的训练过程,这里正负样例是不需要构建的,
因为用户的评分值rate是已知的,可以当做标签来使用。
其实本质上是找到 用户特征矩阵U 、 物品特征向量M,学会对这两个向量的模拟。 这里新加的bi和bu整好应对之前感觉使用坐标来定位感觉信息不够,
bi和bu是新加的信息,其中bi表示电影i的评分相对于平均评分的偏差,bu表示用户u所做的评分相对于平均评分的偏差,相当于是一种补足信息吧。
p = self.meanV + self.bu[uid] + self.bi[iid] + np.sum(self.U[uid] * self.M[iid])
"""
def __init__(self, epoch, eta, user