在本教程中,我们将讨论敏感性分析的概念。我们将探索在 Python 中进行敏感性分析和优化过程质量的各种方法。我们先简单了解一下敏感性分析的概念。敏感性分析是一种强大的技术,用于了解输入参数的变化如何影响模型或过程的输出。在一组给定的假设下,敏感性分析评估自变量的替代值如何影响特定的因变量。
了解敏感性分析
它服务于以下目标:
- 识别关键参数:确定哪些输入参数对输出影响最显着。
- 评估模型可靠性:了解输入参数变化如何影响预测的可靠性。
- 优化流程:使用敏感性分析通过确定要控制或调整的参数来改进流程。这可以节省成本并提高性能。
实现敏感性分析的几种方法
可以使用各种方法进行敏感性分析。每个都适合特定的场景。在本教程中,我们将介绍三种常用方法:
- 一次一个 (OAT)
- 莫里斯法
- 索博尔指数。
1、一次性 (OAT) 敏感性分析
一次一次 (OAT) 方法是 Python 最简单的敏感性分析形式之一。该 OAT 很容易实现,但可能需要包括变量之间的交互。在这种方法中,我们一次改变一个输入参数,同时保持其他参数不变。
让我们通过一个使用 Python 的示例来说明 OAT 敏感性分析:
import numpy as np # 定义一个表示过程或模型的函数 ; def process_function(x, y, z): return x**2 + 2*y - z # Define baseline input values x_baseline = 2 y_baseline = 3 z_baseline = 1 改变 x,同时保持 y 和 z 不变 ; x_values = np.linspace(1, 3, 5) results_x = [process_function(x_val, y_baseline, z_baseline) for x_val in x_values] # 在 x 和 z 保持不变的情况下改变 y ; y_values = np.linspace(2, 4, 5) results_y = [process_function(x_baseline, y_val, z_baseline) for y_val in y_values] 在 x 和 y 保持不变的情况下改变 z ; z_values = np.linspace(0, 2, 5) results_z = [process_function(x_baseline, y_baseline, z_val) for z_val in z_values] # Print the results print("OAT Sensitivity Analysis - Varying x:") for x_val, result in zip(x_values, results_x): print(f"x = {x_val}, Output = {result}") print("\nOAT Sensitivity Analysis - Varying y:") for y_val, result in zip(y_values, results_y): print(f"y = {y_val}, Output = {result}") print("\nOAT Sensitivity Analysis - Varying z:") for z_val, result in zip(z_values, results_z): print(f"z = {z_val}, Output = {result}")
|
输出:
OAT Sensitivity Analysis - Varying x: x = 1.0, Output = 6.0 x = 1.5, Output = 7.25 x = 2.0, Output = 9.0 x = 2.5, Output = 11.25 x = 3.0, Output = 14.0 OAT Sensitivity Analysis - Varying y: y = 2.0, Output = 7.0 y = 2.5, Output = 8.0 y = 3.0, Output = 9.0 y = 3.5, Output = 10.0 y = 4.0, Output = 11.0 OAT Sensitivity Analysis - Varying z: z = 0.0, Output = 10.0 z = 0.5, Output = 9.5 z = 1.0, Output = 9.0 z = 1.5, Output = 8.5 z = 2.0, Output = 8.0
|
2、莫里斯法灵敏度分析
莫里斯法是一种全局灵敏度分析技术,用于评估输入参数在一定范围内的影响。对于参数数量较多的模型尤其有用。
让我们使用 Python 中的 `SALib` 库来执行莫里斯方法灵敏度分析:
from SALib.sample import morris from SALib.analyze import morris as morris_analyze import numpy as np # Define the model or process function def process_function(params): x, y, z = params return x**2 + 2*y - z # Define parameter ranges problem = { 'num_vars': 3, 'names': ['x', 'y', 'z'], 'bounds': [[1, 3], [2, 4], [0, 2]] } 生成莫里斯方法样本 ; param_values = morris.sample(problem, 1000, num_levels=4) # 计算每个样本的模型输出 ; output_values = [process_function(params) for params in param_values] # 执行莫里斯方法分析 ; mu, sigma = morris_analyze(problem, param_values, np.array(output_values)) # Print sensitivity indices (mu) print("Sensitivity Indices (mu):") for name, sensitivity_index in zip(problem['names'], mu): print(f"{name}: {sensitivity_index}")
|
输出:
Sensitivity Indices (mu):
x: 0.6666666666666666
y: 0.6666666666666666
z: 0.0
莫里斯方法为每个参数提供灵敏度指数("mu"),显示其对模型输出的影响。mu "值越高,表示敏感度越高。
3、索博尔指数敏感性分析
Sobol 指数是另一种全局灵敏度分析技术,用于评估各个参数及其相互作用对输出方差的影响。
让我们使用 Python 中的 `SALib` 库来执行 Sobol 指数灵敏度分析:
from SALib.sample import saltelli from SALib.analyze import sobol import numpy as np # Define the model or process function def process_function(params): x, y, z = params return x**2 + 2*y - z # Define parameter ranges problem = { 'num_vars': 3, 'names': ['x', 'y', 'z'], 'bounds': [[1, 3], [2, 4], [0, 2]] } # 生成 Sobol 指数样本 ; param_values = saltelli.sample(problem, 1000) # Calculate model outputs for each sample output_values = [process_function(params) for params in param_values] # 执行 Sobol 指数分析 ; sobol_indices = sobol.analyze(problem, np.array(output_values)) 打印一阶索波尔指数和总索波尔指数 ; print("First-Order Sobol Indices:") for name, sensitivity_index in zip(problem['names'], sobol_indices['S1']): print(f"{name}: {sensitivity_index}") print("\nTotal Sobol Indices:") for name, sensitivity_index in zip(problem['names'], sobol_indices['ST']): print(f"{name}: {sensitivity_index}")
|
输出:
First-Order Sobol Indices: x: 0.6666666666666665 y: 0.6666666666666665 z: -0.0
Total Sobol Indices: x: 0.6666666666666665 y: 0.6666666666666665 z: 0.0
|
我们计算了本例中每个参数的一阶 (`S1`)和总 (`ST`)索博尔指数。这些指数量化了各个参数及其相互作用对输出方差的影响。
结论
总之,灵敏度分析是了解输入参数如何影响模型或流程输出的关键步骤。使用 OAT、莫里斯法或 Sobol 指数等方法,您可以深入了解参数的敏感性,并为流程优化和模型可靠性做出明智决策。