使用 SALib 工具箱对测量数据进行 Python 敏感性分析

lel*_*in7 3 optimization python-3.x

我想了解,如何使用 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
Run Code Online (Sandbox Code Playgroud)

因为就我而言,我从实验中获取数据,我没有将 Xi 和 Yi 联系起来的模型。我只有一个输入矩阵和一个输出矩阵。

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

Si = sobol.analyze(problem, Y, print_to_console=True)
Run Code Online (Sandbox Code Playgroud)

我们只使用输入参数边界和输出。但是用这种方法怎么可能知道哪个参数在两个集合之间演化呢?

感谢您的帮助!

Cal*_*ton 5

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

在此处输入图片说明

仍然完成敏感性分析的一种可能方法是使用来自您的实验数据的替代模型或元模型。在这种情况下,您可以使用实验数据来拟合真实模型的近似值。然后可以通过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. Devector。(2006)。“剂量计算环境模型的响应面和灵敏度分析”。可靠性工程和系统安全 91:1241-1251。

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