我想了解,如何使用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
因为在我的例子中,我是从实验中得到数据的,我没有连接习和Yi的模型。我只有一个输入矩阵和输出矩阵。
如果我们假设我的输入数据是从一个拉丁超立方体(一个很好的统计重新划分)生成的,那么如何使用Salib来评估我的参数的敏感性呢?根据我在代码中看到的:
Si = sobol.analyze(problem, Y, print_to_console=True)
我们只使用输入参数边界和输出。但是有了这种方法,怎么可能知道哪一个参数在两个集合之间进化呢?
谢谢你的帮忙!
发布于 2018-01-12 13:06:11
没有根据您对数据的描述使用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)方法的估计量。我不确定是否存在这样的估计,但最好在“数学”或“概率和统计堆栈交换”中发布这个问题。
参考文献:
书名/作者责任者: B .(2006)。“环境剂量计算模型的响应面和灵敏度分析”。可靠性工程与系统安全91:1241-1251。
Saltelli,A.,P. Annoni,I. Azzini,F. Campolongo,M. Ratto,S. Tarantola.2010年。“基于方差的模型输出灵敏度分析。总灵敏度指数的设计与估计”。计算机物理通信181:259-270。
https://stackoverflow.com/questions/47286191
复制相似问题