Python中实现敏感性分析以优化流程质量的三种方法

在本教程中,我们将讨论敏感性分析的概念。我们将探索在 Python 中进行敏感性分析和优化过程质量的各种方法。我们先简单了解一下敏感性分析的概念。敏感性分析是一种强大的技术,用于了解输入参数的变化如何影响模型或过程的输出。在一组给定的假设下,敏感性分析评估自变量的替代值如何影响特定的因变量。

了解敏感性分析
它服务于以下目标:

  • 识别关键参数:确定哪些输入参数对输出影响最显着。
  • 评估模型可靠性:了解输入参数变化如何影响预测的可靠性。
  • 优化流程:使用敏感性分析通过确定要控制或调整的参数来改进流程。这可以节省成本并提高性能。

实现敏感性分析的几种方法
可以使用各种方法进行敏感性分析。每个都适合特定的场景。在本教程中,我们将介绍三种常用方法:

  1. 一次一个 (OAT)
  2. 莫里斯法
  3. 索博尔指数。

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 指数等方法,您可以深入了解参数的敏感性,并为流程优化和模型可靠性做出明智决策。