python – Scipy – 如何进一步优化随机梯度下降的稀疏矩阵码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Scipy – 如何进一步优化随机梯度下降的稀疏矩阵码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1285字,纯文字阅读大概需要2分钟。
内容图文
我正在使用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
不幸的是,我的代码仍然很慢,即使是一个小的4×5评级矩阵.我在想这可能是由于循环的稀疏矩阵.我尝试使用花哨的索引来表达q和p的变化但是因为我仍然是scipy和numpy的新手,我无法想出更好的方法来做到这一点.
你有没有关于如何避免明确地迭代稀疏矩阵的行和列的指针?
解决方法:
我差点忘了关于推荐系统的一切,所以我可能会错误地翻译你的代码,但你在每个循环中重新评估self.model-np.dot(self.p,self.qT),而我几乎确信它应该被评估一次每一步.
然后看起来你手工进行矩阵乘法,可能会加速直接矩阵多重复制(numpy或scipy会比你手动更快),类似的东西:
for step in xrange(steps):
e = self.model - np.dot(self.p, self.q.T)
p_temp = learning_rate * np.dot(e, self.q)
self.q *= (1-regularization)
self.q += learning_rate*(np.dot(e.T, self.p))
self.p *= (1-regularization)
self.p += p_temp
内容总结
以上是互联网集市为您收集整理的python – Scipy – 如何进一步优化随机梯度下降的稀疏矩阵码全部内容,希望文章能够帮你解决python – Scipy – 如何进一步优化随机梯度下降的稀疏矩阵码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。