首页 > 解决方案 > 在网格中评估函数,18 维

问题描述

我想评估一个包含 18 个参数(0 到 1)的模型如何拟合一些实验数据。最小化也受到连接 18 个参数的非常复杂的关系的限制。最终,我可以构建一个由 18 个已知值变量组成的函数边界(f11,f12,...),我可以在每个点上对其进行评估,以剔除这 18 个参数的哪些组合是“好的”,然后再评估那些的模型函数。对于给定的一组 (f11, f12, ...) 参数,评估“边界”函数比“模型”函数快 500 倍。

有了一个可笑的粗糙网格,我仍然得到大约 10^6 分。使用 Python 2 代码评估 10^4 点上的边界函数大约需要 20",因此无法扩展到任何有用的网格(大约 10^12 点或更多)。我也知道 Python 是出了名的数字运算速度慢。

问题:

  1. 不同的方法(Fortran)是否有可能快 1000 倍?
  2. 假设存在一个非常快速的算法,是否有机会使用合理数量的点(例如 10^12),逐个评估,以免内存/存储过载?

下面是示例代码(由于边界函数的定义非常长,实际代码大约有 1000 行)。谢谢!

# python2 example code with 3 parameters
# real code has 18 parameters

import numpy as np

def boundary(arr):
    f11,f12,f13 = arr
    return f11*f12+f11*f12*f13-(1-f12)*f13

N = 3
threshold = 0.1

sample_f11 = np.linspace(0,1,N)
sample_f12 = np.linspace(0,1,N)
sample_f13 = np.linspace(0,1,N)

parameters = [(f11, f12, f13) for f11 in sample_f11 for f12 in sample_f12\
for f13 in sample_f13]

good_points = [i for i in parameters if boundary(i) < threshold]

#the real boundary function looks like this:
#def boundary(arr):    
#    f11,f12,f24,f25,f37,f38,f41,f42,f54,f55,f67,f68,f71,f72,f84,f85, \
#    f97,f98 = arr
#    return (2*-((f54*f71*f97*(f97-f68*f97+f67*f98)* \
#    (f71*(-(-(1-f55)*f84-f54*f85)*f97-(-(1-f55)* \
#    f84-f54*f85)*(-f38*f97+f37*f98)+(1-f55-(1-f55)* \
#    f84-f54*f85)*(f97-f68*f97+f67*f98)+f42*((-(1-f55)*f84-f54*f85)*f97+ \
#    [... 700 more lines]

标签: pythonnumpyfortranminimization

解决方案


推荐阅读