我正在实施矩阵分解以预测评论者的电影评级。数据集取自MovieLen(http://grouplens.org/datasets/movielens/)。这是一个经过充分研究的推荐问题,所以我只是为了学习目的而实现这种矩阵分解方法。
我将成本函数建模为训练数据集中预测评级与实际评级之间的均方根误差。我使用scipy.optimize.minimize函数(我使用共轭梯度下降)来计算电影评级矩阵,但是这个优化工具太慢了,即使对于只有100K项目的数据集也是如此。我计划为数据集扩展我的算法,包含2000万个项目。
我一直在寻找基于Python的随机梯度下降解决方案,但我在scikit-learn上发现的随机梯度下降不允许我使用我的自定义成本和梯度函数。
我可以实现自己的随机梯度下降,但我正在与你们核实是否存在这样做的工具。
基本上,我想知道是否有类似这样的API:
optimize.minimize(my_cost_function,
my_input_param,
jac=my_gradient_function,
...)
谢谢! 未
答案 0 :(得分:1)
这很简单(至少是vanilla方法)来实现我不认为有一个"框架"周围。 它只是
my_input_param += alpha * my_gradient_function
也许你想看看theano,它会为你做区分。但是,根据你想做的事情,这可能有点矫枉过正。
答案 1 :(得分:1)
我一直试图在R中做类似的事情,但使用不同的自定义成本函数。
据我所知,关键是要找到渐变,看看哪种方式可以将你带到局部最小值。
使用线性回归(y = mx + c
)和最小二乘函数,我们的成本函数是
(mx + c - y)^2
与m相关的偏导数是
2m(mX + c - y)
使用m = theta
给我们theta <- theta - learning_rate * t(X) %*% (X %*% theta - y) / length(y)
我肯定不知道这一点,但我认为对于线性回归和sqrt(mx + c - y)
的成本函数,梯度步长是与m相关的偏导数,我相信是
m/(2*sqrt(mX + c - y))
如果任何/所有这些都不正确,请(任何人)纠正我。这是我想要学习的东西,并希望知道我是否朝着完全错误的方向前进。