我正在使用带有 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 还是很陌生,所以我想不出更好的方法来做到这一点。
您对我如何避免显式迭代稀疏矩阵的行和列有任何指示吗?