使用SALib工具箱

时间:2017-11-14 12:41:16

标签: python-3.x optimization

我想了解,如何使用SALib python工具箱执行Sobol灵敏度分析(研究参数和交叉参数影响)

从最初的例子来看,我应该这样做:

from SALib.sample import saltelli
from SALib.analyze import sobol
from SALib.test_functions import Ishigami
import numpy as np

problem = {
  'num_vars': 3,
  'names': ['x1', 'x2', 'x3'],
  'bounds': [[-np.pi, np.pi]]*3
}

# Generate samples
param_values = saltelli.sample(problem, 1000)

# Run model (example)
Y = Ishigami.evaluate(param_values)

# Perform analysis
Si = sobol.analyze(problem, Y, print_to_console=True)
# Returns a dictionary with keys 'S1', 'S1_conf', 'ST', and 'ST_conf'
# (first and total-order indices with bootstrap confidence intervals

因为在我的情况下,我从实验中获取数据,所以我没有连接Xi和Yi的模型。我只有一个输入矩阵和一个输出矩阵。

如果我们假设我的输入数据是从拉丁超立方体(一个很好的统计重新分区)生成的,那么如何使用Salib来评估我的参数的灵敏度?从我在代码中看到的内容:

Si = sobol.analyze(problem, Y, print_to_console=True)

我们只使用输入参数边界和输出。但是通过这种方法,如何知道哪个参数在两组之间发展?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

根据您对数据的描述,没有使用SAlib计算Sobol索引的直接方法。 SAlib通过生成两个矩阵(A和B)然后使用通过交叉采样矩阵A中矩阵B的值生成的附加值来计算一阶和全序索引。下图显示了如何完成此操作。当代码评估索引时,它期望模型输出按此顺序排列。以这种方式计算指数的方法基于Saltelli等人公布的方法。 (2010年)。因为这不是拉丁超立方体采样方法,实验数据很可能不起作用。

enter image description here

仍然可以完成灵敏度分析的一种方法是使用实​​验数据中的替代或元模型。在这种情况下,您可以使用实验数据拟合您的真实模型的近似值。然后可以通过SAlib或其他敏感度包来分析此近似值。代理模型通常是多项式或基于克里金法。 Iooss等(2006)描述了一些方法。这种方法的一些软件包括UQlabhttp://www.uqlab.com/,基于MATLAB)和BASShttps://cran.r-project.org/web/packages/BASS/index.html,R包)等,具体取决于具体的模型类型和拟合技术你想用。

另一种可能性是找到一种不基于Saltelli等人(2010)方法的估算器。我不确定这样的估计是否存在,但在数学或概率和统计栈交换中发布这个问题可能会更好。

参考文献:

Iooss,B,F。Van Dorpe,N。Devictor。 (2006年)。 “剂量计算环境模型的响应面和灵敏度分析”。可靠性工程和系统安全91:1241-1251。

Saltelli,A.,P。Annoni,I。Azzini,F。Campolongo,M。Ratto,S。Tarantola。 2010.“基于方差的模型输出灵敏度分析。总灵敏度指数的设计和估算”。计算机物理通讯181:259-270。