SALib敏感性分析入门实践笔记

1. 敏感性分析

敏感性分析是指从定量分析的角度研究有关因素发生某种变化对某一个或一组关键指标影响程度的一种不确定分析技术。 其实质是通过逐一改变相关变量数值的方法来解释关键指标受这些因素变动影响大小的规律。 敏感性因素一般可选择主要参数(如销售收入、经营成本、生产能力、初始投资、寿命期、建设期、达产期等)进行分析。

敏感度分析(Sensitivity analysis,也称敏感性分析)是研究数学模型或系统(数值或其他)输出中的不确定性如何在其输入中被分配到不同的不确定性来源。一个相关的实践是不确定度分析,它更注重不确定度的量化和不确定度的传播;理想情况下,不确定度和敏感度分析应该同时进行。

敏感性分析是一种用于了解模型对输入参数变化的敏感程度的方法。在一个数学或计算模型中,输入参数的变化可能会导致模型输出的变化。敏感性分析的目标是识别哪些输入参数对输出产生重要影响,哪些对输出影响较小。

让我们通过一个简单的例子来理解敏感性分析:

假设有一个简单的天气预测模型,它的输入参数包括:

  1. 温度
  2. 湿度
  3. 风速

输出是:

  • 是否会下雨

我们想知道在这个模型中,哪个输入参数对于预测是否会下雨最为关键。

敏感性分析的步骤:

  1. 选择参数范围: 确定每个输入参数可能的取值范围。比如,温度在0到40摄氏度之间,湿度在0到100%,风速在0到20米/秒之间。

  2. 生成参数组合: 使用敏感性分析工具或方法,生成一系列不同的参数组合,这些组合覆盖了你事先定义的参数范围。

  3. 运行模型: 使用生成的参数组合运行天气预测模型,得到相应的输出(是否会下雨)。

  4. 分析输出变化: 通过分析输出结果,找出哪个输入参数的变化对于是否下雨有重要影响。可能发现,当温度升高时,更容易下雨;湿度增加也增加了下雨的可能性,而风速对是否下雨的影响较小。

  5. 计算敏感性指标: 使用敏感性分析的指标,比如Sobol指数,来量化每个输入参数对输出的影响程度。这些指标提供了一个排序,显示了哪个参数最为重要。

结果解释:

  • 如果某个参数的一阶Sobol指数很大,说明这个参数对输出的影响较大。
  • 如果某个参数的二阶Sobol指数很大,说明这个参数与其他参数的交互作用对输出的影响较大。

通过敏感性分析,我们可以更好地理解模型的行为,确定哪些因素是决定性的,从而在需要调整或优化模型时提供有用的信息。

选择敏感度分析方法的时候需要考虑的要素:

  • 每运行一次模型的计算代价
  • 输入参数之间的相关性
  • 模型的响应是否非线性
  • 输入因素之间的相互作用
    -已有数据的输入范围

2. 常见的敏感度分析方法

(跳过了傅里叶分析相关的方法,只有最后两个方法是全局分析)

  • One at a time(OAT) 方法
    每次变动一个输入并检查对于输出的影响。
    这种方法很简单,但由于它没有考虑输入变量的同时变化,因此并未充分探索输入空间。也无法检测输入变量之间是否存在交互。
  • Screening方法
    窗口法是一种基于采样的方法。目的是要确定哪些输入变量对高维模型中的输出不确定性有重大影响,而不是准确地量化灵敏度。
    它具有相对较低的计算成本,并且可以在对其余集合应用更具信息性的分析之前,用于初步分析中以清除无影响的变量。
    最常用的筛选方法之一是基本效应方法(moris方法)
  • 散点图法
    基于偏导数的局部分析法
    检查输出对于各个输入的偏导数
    也无法充分探索输入空间
    Adjoint modelling and Automated Differentiation 都属于这类方法
  • 回归分析
    在敏感性分析的背景下,回归分析包括将线性回归拟合到模型响应,并使用标准化回归系数作为敏感性的直接度量。
    因此,当模型响应实际上是线性时,此方法最合适。例如,如果确定系数大,则可以确认回归模型有效。
    回归分析的优点是简单且计算成本低。
  • 基于方差的方法(sabol方法)
    是全局方法。可以处理非线性响应,并且可以度量非加性系统中相互作用的影响。
    属于概率论方法。可将输入和输出不确定性量化为概率分布,并将输出方差分解为可归因于输入变量和变量组合的部分。因此,输出对输入变量的敏感度通过该输入引起的输出变化量来度量。
    常常会涉及蒙特卡洛方法
  • 基于响应面的方差分析(VARS)
    这种通过一系列多个变量、确定性的“试验”,来模拟真实极限状态曲面的方法称为响应面法。

3. 关于SALib

SALib(Sensitivity Analysis Library)是一个用于执行全局敏感性分析的Python库。它支持多种敏感性分析方法,其中一种常见的方法是基于Sobol指数的分析。

3.1. Sobol敏感性分析的基本原理

Sobol指数:

Sobol指数是一种衡量输入变量对输出变量方差贡献的方法。它将系统总方差分解为各个输入变量及其组合的贡献。对于一个输入维度为d的系统,Sobol指数可以分为一阶(first-order)、二阶(second-order)和高阶Sobol指数。

  1. 一阶Sobol指数:
    一阶Sobol指数(S_i)衡量单个输入变量对输出变量方差的贡献,计算公式为:

S i = V [ E ( Y ∣ X i ) ] V ( Y ) S_i = \frac{V[E(Y|X_i)]}{V(Y)} Si=V(Y)V[E(YXi)]

其中, V V V 表示方差, E E E 表示期望, Y Y Y 是输出变量, X i X_i Xi 是第i个输入变量。

  1. 二阶Sobol指数:
    二阶Sobol指数(S_{ij})衡量两个输入变量及其组合对输出变量方差的贡献,计算公式为:

S i j = V [ E ( Y ∣ X i , X j ) ] − S i − S j V ( Y ) S_{ij} = \frac{V[E(Y|X_i, X_j)] - S_i - S_j}{V(Y)} Sij=V(Y)V[E(YXi,Xj)]SiSj

其中, X i X_i Xi X j X_j Xj 是两个不同的输入变量。

  1. 总方差分解:
    对于d个输入变量,系统的总方差(( V(Y) ))可以分解为各个输入变量及其组合的一阶和二阶Sobol指数之和。

V ( Y ) = ∑ i = 1 d S i + ∑ i = 1 d ∑ j = i + 1 d S i j + … V(Y) = \sum_{i=1}^{d} S_i + \sum_{i=1}^{d} \sum_{j=i+1}^{d} S_{ij} + \ldots V(Y)=i=1dSi+i=1dj=i+1dSij+

3.2. SALib中的使用

SALib使用模特卡洛模拟方法来估计Sobol指数。它通过生成随机样本(采样)来近似期望值和方差。通过多次采样,可以得到Sobol指数的估计值。

具体而言,SALib的使用步骤包括:

  1. 定义问题: 定义输入参数的分布和输出函数。

  2. 生成样本: 使用Monte Carlo方法生成输入参数的随机样本。

  3. 计算输出: 对于每个样本,计算输出变量的值。

  4. 计算Sobol指数: 使用这些样本计算Sobol指数的估计值。

  5. 分析结果: 分析Sobol指数的结果,了解各个输入变量对输出的影响。

在SALib中,你可以使用不同的采样方法和Sobol指数的估计方法,以满足特定问题的需求。这种全局敏感性分析有助于理解输入变量对输出的影响,优化模型和进行决策。

3.3. 基本解释和评价标准

Sobol敏感性分析的结果通常包括一阶 S 1 S_1 S1和总体 S T S_T ST敏感性指数,这些指数表示了模型输出的变异中各个输入参数的贡献程度。下面是对这些指数的一些基本解释和评价标准:

  1. 一阶敏感性指数 S 1 S_1 S1

    • 表示单个参数对输出变异的贡献。
    • 范围在[0, 1]之间,值越大表示该参数对输出的影响越显著。
    • 如果 S 1 S_1 S1接近于0,表示该参数对输出的影响较小;如果接近于1,表示该参数对输出的影响较大。
  2. 总体敏感性指数 S T S_T ST

    • 表示单个参数和该参数与其他参数的相互作用对输出变异的综合贡献。
    • 范围在[0, 1]之间,值越大表示该参数及其相互作用对输出的影响越显著。
    • 通过 S T S_T ST可以了解整体的输入变异中,多个参数共同贡献了多少。

评价这些指数通常取决于具体的应用和研究目的。一般来说,可以使用以下一些标准进行初步评估:

  • S 1 S_1 S1 S T S_T ST 的绝对值越大,表示对输出的影响越大。
  • 如果某个参数的 S T S_T ST 明显大于 S 1 S_1 S1,则该参数的相互作用较为显著。
  • 如果某个参数的 S 1 S_1 S1明显大于 S T S_T ST,则该参数对输出的影响主要来自于它本身的变异。

需要注意的是,这些指数的评价应该结合具体的背景和模型特性,而且敏感性分析的结果应该被视为对模型的理解的一种贡献,而非唯一的评估标准。

4. SALib实践

4.1. 安装SALib

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple SALib

github地址:
https://github.com/SALib/SALib

4.2. 教程案例一

在本例中,我们将使用SALib主要功能Ishigami函数(如下所示)进行Sobol灵敏度分析。该示例将在下一个教程中重复使用面向对象的界面,可能会发现该界面更容易使用。

Ishigami函数通常用于测试不确定度和灵敏度分析方法,因为它表现出很强的非线性和非单调性。其源代码位于SALib\test_functions\Ishigami.py。对应函数计算公式如下:

f ( x ) = sin ⁡ ( x 1 ) + A sin ⁡ ( x 2 ) 2 + B x 3 4 sin ⁡ ( x 1 ) f(x) = \sin(x_{1}) + A \sin(x_{2})^2 + Bx^{4}_{3}\sin(x_{1}) f(x)=sin(x1)+Asin(x2)2+Bx34sin(x1)

示例代码:


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
}

# SALib.test_functions Ishigami.py
def evaluate(X: np.ndarray, A: float = 7.0, B: float = 0.1) -> np.ndarray:
    Y = np.zeros(X.shape[0])
    Y = (
        np.sin(X[:, 0])
        + A * np.power(np.sin(X[:, 1]), 2)
        + B * np.power(X[:, 2], 4) * np.sin(X[:, 0])
    )

    return Y

# Generate samples
param_values = saltelli.sample(problem, 1024)

# Run model (example)
# Y = Ishigami.evaluate(param_values)
Y = 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)

Si.plot()

在这里插入图片描述

在SALib库中,sobol.analyze函数用于进行Sobol敏感性分析。以下是一些用到的关键参数和具体介绍:
sobol.analyze(problem, Y, calc_second_order=True, print_to_console=False)

  • problem: 描述问题的字典,包括参数的个数、参数名称和参数范围。
  • Y: 模型的输出,是一个包含对应参数样本的模型输出值的数组。
  • calc_second_order: 一个布尔值,指定是否计算二阶Sobol指数。如果为True,则计算,如果为False,则不计算。
  • print_to_console: 一个布尔值,指定是否将结果打印到控制台。

analyze函数返回一个包含Sobol指数和置信区间的字典。以下是一些重要的输出:

  • S1: 一阶Sobol指数,表示每个输入参数对输出的主导影响。
  • ST: 总Sobol指数,表示每个参数总体上对输出的影响,包括直接和交互作用。
  • S2: 二阶Sobol指数,表示两个参数之间的交互作用对输出的影响。
  • S2_conf: 二阶Sobol指数的置信区间。

使用这些指数,你可以了解每个参数的独立贡献以及不同参数之间的相互作用对输出的影响。对于更详细的信息,你可以参考Sobol敏感性分析的相关文献或SALib文档。

4.3. 教程案例二

当您要分析的模型取决于不属于灵敏度分析的参数时,如位置或时间,可以分别对每个时间/位置进行分析。

以抛物线为例:

f ( x ) = a + b x 2 f(x)=a+bx^2 fx=a+bx2

参数 a a a b b b将接受灵敏度分析,但 x x x不会。

import numpy as np
import matplotlib.pyplot as plt

from SALib.sample import saltelli
from SALib.analyze import sobol

def parabola(x, a, b):
    """Return y = a + b*x**2."""
    return a + b*x**2

problem = {
    'num_vars': 2,
    'names': ['a', 'b'],
    'bounds': [[0, 1]]*2
}

# sample
param_values = saltelli.sample(problem, 2**6)
# evaluate
x = np.linspace(-1, 1, 1000)
y = np.array([parabola(x, *params) for params in param_values])
# analyse
sobol_indices = [sobol.analyze(problem, Y) for Y in y.T]

S1s = np.array([s['S1'] for s in sobol_indices])

fig = plt.figure(figsize=(10, 6), constrained_layout=True)
gs = fig.add_gridspec(2, 2)

ax0 = fig.add_subplot(gs[:, 0])
ax1 = fig.add_subplot(gs[0, 1])
ax2 = fig.add_subplot(gs[1, 1])

for i, ax in enumerate([ax1, ax2]):
    ax.plot(x, S1s[:, i],
            label=r'S1$_\mathregular{{{}}}$'.format(problem["names"][i]),
            color='black')
    ax.set_xlabel("x")
    ax.set_ylabel("First-order Sobol index")

    ax.set_ylim(0, 1.04)

    ax.yaxis.set_label_position("right")
    ax.yaxis.tick_right()

    ax.legend(loc='upper right')

ax0.plot(x, np.mean(y, axis=0), label="Mean", color='black')

# in percent
prediction_interval = 95

ax0.fill_between(x,
                 np.percentile(y, 50 - prediction_interval/2., axis=0),
                 np.percentile(y, 50 + prediction_interval/2., axis=0),
                 alpha=0.5, color='black',
                 label=f"{prediction_interval} % prediction interval")

ax0.set_xlabel("x")
ax0.set_ylabel("y")
ax0.legend(title=r"$y=a+b\cdot x^2$",
           loc='upper center')._legend_box.align = "left"

plt.show()

在这里插入图片描述

5. 总结

敏感性分析与AHP结合使用具有重要的应用意义,主要体现在以下几个方面:

  1. 决策可靠性评估: 敏感性分析能够评估决策模型对输入参数变化的敏感程度,从而帮助决策者判断模型的可靠性。与AHP结合,可以更全面地评估模型各部分对决策结果的影响,提高决策的准确性和可靠性。

  2. 权重调整与优化: 在AHP中,确定因素权重是关键的一步。敏感性分析可以帮助识别模型对不同因素权重变化的响应,为权重的调整提供参考。通过综合敏感性分析结果,优化AHP的判断矩阵,提高决策模型的精度。

  3. 风险管理: 敏感性分析有助于识别模型对输入参数变化的敏感程度,从而帮助决策者更好地理解决策的风险。在AHP的框架下,通过分析各因素对决策结果的敏感性,可以有针对性地制定风险管理策略,提高决策的稳健性。

  4. 决策方案比较: 敏感性分析可以用于比较不同决策方案在输入参数变化下的表现。结合AHP,可以更全面地考虑不同因素的权重,使决策者更准确地评估各个方案的优劣,有助于选取最优决策方案。

  5. 决策过程透明度: 敏感性分析提高了决策模型的透明度,使决策者对模型的运作机制有更清晰的认识。结合AHP,可以将不同因素的权重纳入考虑,使决策过程更加透明,有助于决策者更好地理解和接受决策模型的结果。

综合来看,敏感性分析与AHP的结合使用可以提高决策模型的鲁棒性,增强决策的科学性和可操作性,对于复杂的决策问题具有重要的应用价值。

参考:
SALib - Sensitivity Analysis Library in Python
忘荃小学. Python中的模型敏感度分析(使用Salib). 知乎. 2020.05

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/211126.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis数据结构之跳表

跳表是一种有序的数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。其核心思想就是通过建立多级索引来实现空间换时间。 在Redis中,使用跳表作为Zset的一种底层实现之一,这也是跳表在Redis中的…

IO延迟引起的虚拟机故障排查

vmware 虚拟机连上之后总感觉非常卡,查看CPU 内存资源使用率是正常的。 message 日志有cpu卡住的报错 NMI watchdog: BUG: soft lockup - CPU#8 stuck for 23s! [container-31451:45878]下面分析是什么导致的服务器cpu卡住。 1、打开prometheus,观察服务…

CSS新手入门笔记整理:CSS图片样式

图片大小 语法 width:像素值; height:像素值; 图片边框:border 语法 边框:宽度值 样式值 颜色值; border:1px solid red; 图片对齐 水平对齐:text-align 语法 text-align:取值; 属性值 说明 left 左对齐(默认值) cent…

神经网络 代价函数

神经网络 代价函数 首先引入一些便于稍后讨论的新标记方法: 假设神经网络的训练样本有 m m m个,每个包含一组输入 x x x和一组输出信号 y y y, L L L表示神经网络层数, S I S_I SI​表示每层的neuron个数( S l S_l Sl​表示输出…

[英语学习][5][Word Power Made Easy]的精读与翻译优化

[序言] 今日完成第18页的阅读, 发现大量的翻译错误以及不准确. 需要分两篇文章进行讲解. [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西, 同时加入我的社区讨论与交流英语相关的内容. [原著英文与翻译版对照][第18页] Wh…

基于SpringBoot的企业客户管理系统的设计与实现

摘 要 本论文主要论述了如何使用JAVA语言开发一个企业客户管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述企业客户管理系统的当前背景以及系统开发的目…

STM32---MDK工程创建

本节我们带领大家学习如何新建一个寄存器库版本MDK的详细步骤; 由于51单片机的学习时,所涉及的寄存器很少,所以往往几个头文件、驱动文件就可以完成相关的功能,但是对于STM32来讲,涉及的寄存器、头文件等都很多&#…

CleanMyMac X4.16.2最新2024注册许可证

都说苹果的闪存是金子做的,这句话并非空穴来风,普遍都是256G起步,闪存没升级一个等级,价格都要增加上千元。昂贵的价格让多数消费者都只能选择低容量版本的mac。而低容量的mac是很难满足用户的需求的,伴随着时间的推移…

005、简单页面-容器组件

之——布局 目录 之——布局 杂谈 正文 1.布局基础知识 2.Column 3.Row 4.实践 杂谈 布局容器组件。 一个丰富的页面需要很多组件组成,那么,我们如何才能让这些组件有条不紊地在页面上布局呢?这就需要借助容器组件来实现。 容器组件是…

elment Loading 加载组件动态变更 text 值bug记录

先上效果图: 倒计时4分钟组件方法 // 倒计时 4分钟getSencond() {this.countDown 4分00秒this.interval setInterval(() > {this.maxTime--;let minutes Math.floor(this.maxTime / 60);let seconds Math.floor(this.maxTime % 60);minutes minutes < 10 ? 0 minu…

AI 绘画 | Stable Diffusion 电商模特

前言 上一篇文章讲到如何给人物更换背景和服装。今天主要讲电商模特,就是服装电商们的固定服装产品图片如何变成真人模特穿上的固定服装产品效果图。如果你掌握了 《AI 绘画 | Stable Diffusion 人物 换背景|换服装》,这篇文章对你来说,上手会更轻松。 教程 提取服装蒙版…

解决Wireshark分析RTMP抓包时Unknown问题

使用Wireshark抓包时&#xff0c;经常出现很多Unknown包&#xff0c;但实际上的字节流实际是正常的。 其实&#xff0c;RTMPT设置里有一个最大包大小的设置&#xff0c;默认是32768&#xff0c;而且默认RTMPT协议配置了从多个TCP流中重组RTMPT的功能(应当是考虑基于HTTP的传输…

SpringBoot+SSM项目实战 苍穹外卖(2)

继续上一节的内容&#xff0c;本节完成新增员工、员工分页查询、启用禁用员工账号、编辑员工、导入分类模块功能代码。 目录 新增员工(完整流程分为以下五个部分)需求分析和设计代码开发功能测试代码完善 (ThreadLocal 线程局部变量)代码提交 员工分页查询代码完善 扩展Spring …

css中元素水平居中的方式

文章目录 前言水平居中&#xff1a;垂直居中方法一: text-align: centerdisplay: table-cell方法二:父元素静态定位子元素通过相对定位来实现方法三:通过静态和相对定位方法四 css图片居中用text-align:center无效怎么回事&#xff1f;如何让图片在DIV中水平和垂直两个方向都居…

prometheus|云原生|kubernetes内部安装prometheus

架构说明&#xff1a; prometheus是云原生系统内的事实上的监控标准&#xff0c;而kubernetes集群内部自然还是需要就地取材的部署prometheus服务了 那么&#xff0c;prometheus-server部署的方式其实是非常多的&#xff0c;比如&#xff0c;kubesphere集成方式&#xff0c;h…

前端面试JS— JS数据类型及相关内容

目录 JS数据类型 基本数据类型&#xff1a; 引用数据类型&#xff1a; 两种数据存储方式&#xff1a; 两种数据类型的区别&#xff1a; 数据类型的检测方式 null和undefined区别 JS数据类型 基本数据类型&#xff1a; Number&#xff0c;String&#xff0c;Boolean&#xff0c;…

Safe and Practical GPU Computation in TrustZone论文阅读笔记

Safe and Practical GPU Computation in TrustZone 背景知识&#xff1a; youtube GR视频讲解链接&#xff1a;ASPLOS’22 - Session 2A - GPUReplay: A 50-KB GPU Stack for Client ML - YouTube GPU软件栈&#xff1a; 概念&#xff1a;"GPU软件栈"指的是与GPU硬件…

以下哪项不是在内蒙古举办的?()

需要查看更多试题和答案&#xff0c;可以前往题海舟&#xff08;题海舟&#xff09;进行搜题查看。可以搜“题干关键词”。 以下哪项不是在内蒙古举办的&#xff1f;&#xff08;&#xff09; A.中蒙博览会 B.东北亚区域合作高峰论坛 C.中蒙俄合作高层论坛 D.中日经济合作会 …

C语言之位段(详解)

C语言之位段 文章目录 C语言之位段1. 位段的介绍2. 位段的内存分配3. 位段跨平台问题4. 位段的应用5. 位段使用注意 1. 位段的介绍 位段&#xff08;bit-field&#xff09;是C语言中的一种特殊数据类型&#xff0c;它允许将一个字节分成几个部分&#xff0c;并为每个部分指定特…

Sql Server数据库跨机器完整恢复(源文件恢复)

问题描述 在操作系统异常的情况下&#xff0c;SQL Server 和相关的业务系统遭受了不可用的情况。由于操作系统问题&#xff0c;导致旧服务器无法正常运行。为了恢复业务功能并确保数据完整性&#xff0c;采取了以下步骤来在新机器上进行 SQL Server 的重新安装和数据恢复。 面…