【发布时间】:2017-03-23 06:42:22
【问题描述】:
我必须找到 >10^7 方程系统的最佳解决方案,其中每个方程有 2 个变量中的 5 个方程(5 次测量以找到长序列中误差最小的 2 个参数)。 下面的代码(通常用来做曲线拟合)做我想要的:
#Create_example_Data
n = 100
T_Arm = np.arange(10*n).reshape(-1, 5, 2)
Erg = np.arange(5*n).reshape(-1, 5)
m = np.zeros(n)
c = np.zeros(n)
#Run
for counter in xrange(n):
m[counter], c[counter] = np.linalg.lstsq(T_Arm[counter, :, :],
Erg[counter, :])[0]
不幸的是,它太慢了。有什么办法可以显着加快这段代码的速度吗?我试图对其进行矢量化,但没有成功。使用最后一个解决方案作为初始猜测可能也是一个好主意。使用scipy.optimize.leastsq 也没有加快速度。
【问题讨论】:
-
什么是
Inputlen?是n吗? -
n 是方程组的个数,等于 Inputlen,我更正了代码
-
我认为应该是
xrange(n)而不是xrange(len(n))因为n只是一个整数(在这种情况下为 100) -
所以每个
counter值的leastsqr是独立的?没有办法将其转换为更大的最小平方问题? -
你能告诉我们解决所有这些方程需要多少时间,你认为什么时间可以接受?另外:我相信最好的办法是尝试和操作所有这些系统,以便您可以将它们组合在一起并减少要独立解决的系统数量......最后,如果所有其他方法都失败了,您可能会对多线程/处理感兴趣并行解决它们。如果我没记错的话,numpy 应该发布 GIL,所以即使是多线程也应该提供一些好处。
标签: python performance numpy linear-algebra