我想了解,如何使用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)
我们只使用输入参数边界和输出。但是通过这种方法,如何知道哪个参数在两组之间发展?
感谢您的帮助!
答案 0 :(得分:2)
根据您对数据的描述,没有使用SAlib
计算Sobol索引的直接方法。 SAlib
通过生成两个矩阵(A和B)然后使用通过交叉采样矩阵A中矩阵B的值生成的附加值来计算一阶和全序索引。下图显示了如何完成此操作。当代码评估索引时,它期望模型输出按此顺序排列。以这种方式计算指数的方法基于Saltelli等人公布的方法。 (2010年)。因为这不是拉丁超立方体采样方法,实验数据很可能不起作用。
仍然可以完成灵敏度分析的一种方法是使用实验数据中的替代或元模型。在这种情况下,您可以使用实验数据拟合您的真实模型的近似值。然后可以通过SAlib
或其他敏感度包来分析此近似值。代理模型通常是多项式或基于克里金法。 Iooss等(2006)描述了一些方法。这种方法的一些软件包括UQlab
(http://www.uqlab.com/,基于MATLAB)和BASS
(https://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。