【发布时间】:2013-11-30 16:36:48
【问题描述】:
我正在为使用 Scipy 的稀疏矩阵的推荐系统实现随机梯度下降算法。
这是第一个基本实现的样子:
N = self.model.shape[0] #no of users
M = self.model.shape[1] #no of items
self.p = np.random.rand(N, K)
self.q = np.random.rand(M, K)
rows,cols = self.model.nonzero()
for step in xrange(steps):
for u, i in zip(rows,cols):
e=self.model-np.dot(self.p,self.q.T) #calculate error for gradient
p_temp = learning_rate * ( e[u,i] * self.q[i,:] - regularization * self.p[u,:])
self.q[i,:]+= learning_rate * ( e[u,i] * self.p[u,:] - regularization * self.q[i,:])
self.p[u,:] += p_temp
不幸的是,我的代码仍然很慢,即使是一个小的 4x5 评级矩阵。我在想这可能是由于循环的稀疏矩阵。我尝试过使用花哨的索引来表达 q 和 p 的变化,但是由于我对 scipy 和 numpy 还是很陌生,所以我想不出更好的方法来做到这一点。
您对我如何避免显式迭代稀疏矩阵的行和列有任何指示吗?
【问题讨论】:
-
你可能会从这个代码审查案例中得到一些想法:codereview.stackexchange.com/questions/32664/…。它还涉及迭代稀疏矩阵的行,计算每一行的误差,然后继续下一行。加速包括简化内部循环、在稀疏矩阵上找到最快的迭代以及 cython 代码。
-
也许你应该看看 scikit-learn SGD 实现 (scikit-learn.org/stable/modules/sgd.html)。
标签: python numpy scipy sparse-matrix matrix-factorization