我目前正在开发一个推荐系统,让用户给电影打分,然后给出预测。到目前为止,我使用的是惊奇库SVD算法,它似乎非常好,并且有很好的文档记录。然而,我遇到了一个问题:我不想针对用户所做的每一次评级对整个模型进行重新培训。
我提出的解决方案是使用之前计算的电影系数和用户输入来生成用户系数,但即使我试图过度拟合以100%重新创建原始评级,我也无法生成非常准确的用户系数
到目前为止,我使用了两种方法:
我相信第一种方法叫做最小二乘法,我只是尝试用这行代码从数学上计算完美的用户因素:
np.linalg.inv(X.T@X)@(X.T@y) #@ being matrix multiplication and .T transpose
(我将1添加到X以获得userbias,并从Y中减去moviebias) 这种方法根本不复制数据
我尝试的第二种方法是完全按照surprise documentation中描述的方式实现梯度下降,除了不改变电影因素
eui = x.rating - (itemfac[item]@userfac.T + itembias[item] + userbias)
userbias += a*(eui-r*userbias)
userfac += a*(eui*itemfac[item] - r*userfac)
(Do multiple Iterations with a being learning rate and r being regularization)
这个方法很有效,但不是很准确,我甚至不能让它过度拟合
有没有什么方法是我没有想到的,或者在惊喜库中有没有内置函数来实现这个功能? 还是我只需要进一步改进其中一种方法
目前没有回答
相关问题 更多 >
编程相关推荐