网格中的评估函数,18维

2024-09-30 20:36:48 发布

您现在位置:Python中文网/ 问答频道 /正文

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

用一个可笑的粗糙网格,我仍然得到大约10^6分。使用Python2代码在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]

Tags: sample函数参数np边界parametersboundaryf11