python - 在网格中评估函数,18 维
问题描述
我想评估一个包含 18 个参数(0 到 1)的模型如何拟合一些实验数据。最小化也受到连接 18 个参数的非常复杂的关系的限制。最终,我可以构建一个由 18 个已知值变量组成的函数边界(f11,f12,...),我可以在每个点上对其进行评估,以剔除这 18 个参数的哪些组合是“好的”,然后再评估那些的模型函数。对于给定的一组 (f11, f12, ...) 参数,评估“边界”函数比“模型”函数快 500 倍。
有了一个可笑的粗糙网格,我仍然得到大约 10^6 分。使用 Python 2 代码评估 10^4 点上的边界函数大约需要 20",因此无法扩展到任何有用的网格(大约 10^12 点或更多)。我也知道 Python 是出了名的数字运算速度慢。
问题:
- 不同的方法(Fortran)是否有可能快 1000 倍?
- 假设存在一个非常快速的算法,是否有机会使用合理数量的点(例如 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]
解决方案
推荐阅读
- julia - julia微分方程中多个数据集的参数估计
- class - 使用 size_t 类型变量初始化模板构造函数
- python - 使用 Python 获取 Windows 审计策略
- reactjs - 如何使用情感js将多个classNames传递给内部孩子
- r - R:使用估计边际均值但不假设方差相等的事后比较
- amazon - Alexa 技能不会通过语音安装
- apache-spark - spark DataFrame 使用爆炸和描述函数
- database - DBInit DatabaseTablesPreparer NullPointerException
- spring - Spring 计划的休眠查询
- ios - (Siri) 创建自己的解析方法