【发布时间】:2020-05-22 15:15:14
【问题描述】:
我正在处理scipy.optimize 的优化问题,该问题旨在计算一些 3D 地图。给定 3 个真实数据量 (vol0, vol1, vol2) 我的目标是通过体素强度的某些函数与其模型的体素拟合来估计 3 个参数 (map_0, map_1, map_2) 的映射。
到目前为止,这是我开始的想法:
import scipy
import numpy as np
from scipy.optimize import minimize
def objective (x,arg0,arg1):
vol_model0 = someFun( arg0[0], arg1, ... ) # *model value for arg0 which needs arg0[0] and arg1*
vol_model1 = someFun( arg0[1], arg1, ... ) # *model value for arg0 which needs arg0[1] and arg1*
vol_model2 = someFun( arg0[2], arg1, ... ) # *model value for arg0 which needs arg0[2] and arg1*
RSS = np.sum( [ np.power( ( arg0[0] - vol_model0 ), 2 )
+ np.power( ( arg0[1] - vol_model1 ), 2 )
+ np.power( ( arg0[2] - vol_model2 ), 2 ) ]
)
return RSS
arg1 = [1, 2, 3, 4]
vol0 = 5* np.zeros([100,100,100])
vol1 = 3* np.zeros([100,100,100])
vol2 = 4* np.zeros([100,100,100])
map_0 = np.zeros([100,100,100])
map_1 = np.zeros([100,100,100])
map_2 = np.zeros([100,100,100])
x0 = [5, 5, 5]
bnds = ( (1,10), (1, 10), (1, 10) )
for i0 in range(0,100):
for i1 in range(0,100):
for i2 in range(0,100):
arg0 = [ vol0[i0,i1,i2], \
vol1[i0,i1,i2], \
vol2[i0,i1,i2] \
]
res = minimize(objective, x0, args = (arg0,arg1), bounds = bnds)
map_0[i0,i1,i2], \
map_1[i0,i1,i2], \
map_2[i0,i1,i2] = res.x
我的问题是:
考虑到这个受约束的优化问题,有没有办法让整个过程更快?嵌套的 for 循环需要很长时间才能完成。
我想知道是否有办法将这个问题并行化或使其更快。
【问题讨论】:
-
您是否介意陈述一些确凿的事实:A)在中完成对
minimize( objFUN, x0, args = ( ... ), ... )的一次调用需要多长时间>[s]? B ) 您可接受的目标完成时间是多少[s]? C ) 您有哪些可用的硬件资源 - RAM [GB]? CPU [1(核心)]?其他? 谢谢。 -
您好,感谢您与我们联系! A) 最小化函数运行大约需要 0.1 秒 B) 对于预期目的,可接受的时间是当前持续时间的十分之一 C) 我有一个 8 GB RAM,带有 Intel(R) Core(TM) i7 -8550U CPU @ 1.80GHz(8 个 CPU)。如果您需要更多详细信息,请告诉我
标签: python multidimensional-array parallel-processing minimize