python 矩阵乘法梯度下降_Scipy如何进一步优化随机梯度下降的稀疏矩阵代码

我正在用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评级矩阵。我想这可能是由于稀疏矩阵for循环。我尝试过用奇特的索引来表达q和p的变化,但是由于我还是scipy和numpy的新手,我想不出更好的方法来实现它。在

关于如何避免显式地遍历稀疏矩阵的行和列,您有什么建议吗?在

你可能感兴趣的:(python,矩阵乘法梯度下降)