问题:对movieslen数据集进行电影评分进行预测
1.数据处理
数据集
数据集使用了下载的1M的movieslen数据集,这里主要使用用户评分数据——ratings.csv.数据如下所示主要有用户id,电影id和评分,数据如下。
接下来对用户和评分矩阵进行矩阵分解,首先要将其变成矩阵。对dataframe进行变换,仅提取出"userId",“movieId”,“rating”,然后变成行为用户id,列变成电影id
data_twe=data[["userId","movieId","rating"]]
data_new=data_twe.set_index(["userId",'movieId'])["rating"].unstack()
data_new
统计得出的数据的各列缺失值,总缺失值,缺失率
#各列缺失值
listlose=data_new.isnull().sum()
lose=listlose.sum()
x,y=data_new.shape
lose/(x*y)
2.SVD
矩阵初始化
SVD奇异值分解实现,将6109724的特征矩阵分解为Q=610K 和P=K*9724的矩阵相称。k设为1000,随机初始化Q,P,因为特征矩阵是评估为[0,5],所以Q,P范围在0到1
k=1000
import numpy as np
Q=np.random.rand(610,k)
P=np.random.rand(k,9724)
Q_np=np.array(Q)
P_np=np.array(P)
data_new_p=np.dot(Q,P)
loss=data_new-data_new_p
浮点数随机的矩阵相乘得出的矩阵与原式相差过大,为了减少初期训练的次数。所以对数据对浮点随机数都除以10,最近得出的拟合矩阵为原本100倍比较接近原本的结果
损失值计算
loss计算:原矩阵非空值,与使用Q,P相乘的所得矩阵的差值的平方和
sub_f=sub**2
sub_f.sum().sum()
随机梯度下降训练
损失值还是比较大的,然后为了拟合,使用随机梯度下降的方法,即随机选原矩阵中非空的一个值,通过特定Q,P拟合矩阵的值,减去偏导。更新修改P,Q矩阵的值。这里学习率U=0.1,(一次)
U=0.1
sub_isnull=sub.isnull()
while(True):