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 npproblem = {'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 pltfrom SALib.sample import saltelli
from SALib.analyze import soboldef parabola(x, a, b):"""Return y = a + b*x**2."""return a + b*x**2problem = {'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 = 95ax0.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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

autojs-ui悬浮按钮模板

注释很详细,直接上代码 涵盖很多常用知识点,也可当知识点看 运行效果长这样: 开始按钮相当于开关,按钮内容会随点击变换控制台按钮可让运行框显示或隐藏退出按钮退出程序并在3s后关闭运行框只需在对应函数内添加需要实现的内容即可…

算法复习,数据结构 ,算法特性,冒泡法动态演示,复杂度,辗转相除法*,寻找最大公因数

算法复习 知识点 1. 程序 数据结构 算法 2. 算法: 求解问题的策略数据结构:问题的数学模型程序:微计算机处理问题编制的一组指令 3. **特性 ** 有穷性:算法在执行有穷步后能结束确定性:每一指令有确切的含义&a…

2023年12月4日支付宝蚂蚁庄园小课堂小鸡宝宝考考你今日正确答案是什么?

问题:你知道电杆上安装的“小风车”有什么用途吗? 答案:防止鸟类筑巢 解析:小风车一般做成橙色,因为橙色是一种可令野鸟产生恐慌感的颜色;小风车在转动时,会发出令野鸟害怕的噪声;…

LLM推理部署(四):一个用于训练、部署和评估基于大型语言模型的聊天机器人的开放平台FastChat

FastChat是用于对话机器人模型训练、部署、评估的开放平台。体验地址为:https://chat.lmsys.org/,该体验平台主要是为了收集人类的真实反馈,目前已经支持30多种大模型,已经收到500万的请求,收集了10万调人类对比大模型…

4个解决特定的任务的Pandas高效代码

在本文中,我将分享4个在一行代码中完成的Pandas操作。这些操作可以有效地解决特定的任务,并以一种好的方式给出结果。 从列表中创建字典 我有一份商品清单,我想看看它们的分布情况。更具体地说:希望得到唯一值以及它们在列表中出…

uniapp 微信小程序连接蓝牙卡死

解决方法,需要同意隐私保护协议,否则不能开启蓝牙权限和定位权限,会导致定位失败

实用工具网站合集值得收藏![搜嗖工具箱]

最近一段时间有点忙,一直没有更新在此给大家说声抱歉哈,有些小伙伴儿私信说想要用到的工具,茶壶儿也会尽可能满足大家!今天我们要分享的工具主要有以下几款,我们来一起看一下吧? 一帧秒创 https://aigc.y…

万界星空科技灯具行业MES介绍

中国是LED照明产品最大的生产制造国,如今,我国初步形成了包括LED外延片的生产、LED芯片的制备、LED芯片的封装以及LED产品应用在内的较为完超为产业链,随着LED照明市场渗诱率的快速警升,LED下游应用市场将会越来越广阔。这也将推动…

电机工厂怎么才能有效的管理生产?

电机工厂要想更有效地管理,可以从以下几个方面入手:采用数字化软件管理工具 数字化软件管理工具可以帮助电机工厂实现工艺流程自动化、数据管理、生产计划排程等。例如,采用ERP(企业资源计划)系统可以协调管理生产过程…

SpringCloud Gateway

目录 一、gateway简介二、gateway快速入门2.1 引入依赖2.2 编写启动类2.3 编写基础配置和路由规则 三、断言工厂四、过滤器工厂4.1 路由过滤器的种类4.2 请求头过滤器4.3 默认过滤器 五、全局过滤器5.1 全局过滤器作用5.2 自定义全局过滤器5.3 过滤器执行顺序 六、跨域问题6.1 …

Sailfish OS 移动操作系统

Jolla 是一家曾经致力于开发智能手机和平板电脑的公司,但是这些产品并没有取得成功。后来 Jolla 将重心转向了基于 Linux 的 Sailfish OS(旗鱼),并将其应用于现有设备上。Sailfish OS 是由 Jolla 在 MeeGo 基础上开发的移动操作系…

鸿蒙绘制折线图基金走势图

鉴于鸿蒙下一代剥离aosp,对于小公司而言,要么用h5重构,要么等大厂完善工具、等华为出转换工具后跟进,用鸿蒙重新开发一套代码对于一般公司而言成本会大幅增加。但对于广大开发者来说,暂且不论未来鸿蒙发展如何&#xf…

实现跨平台高手必修的课程,玩转Flutter动态化的解决的一些精华部分总结

Flutter作为一种快速、可靠的跨平台移动应用开发框架,在动态化方面也有很多令人兴奋的特性。本文将总结Flutter动态化的一些精华部分,帮助开发者更好地利用这些功能。 正文: 在实现跨平台高手必修的课程中,Flutter动态化是一个不…

区块链媒体:Web3.015个方法解析-华媒舍

Web3.0是第三代互联网的发展阶段,相较于Web2.0,它具有更高的可信性、安全性和去中心化特点。在Web3.0时代,推广变得更为重要,因为吸引用户和提高品牌知名度对于在竞争激烈的市场中脱颖而出至关重要。本文将揭秘推广Web3.0的15个秘…

P2 Linux系统目录结构

前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_ChenPi的博客-CSDN博客》✨✨✨ 🛸推荐专…

如何跑通跨窗口渲染:multipleWindow3dScene

New 这是一个跨窗口渲染的示例,用 Three.js 和 localStorage 在同一源(同产品窗口)上跨窗口设置 3D 场景。而这也是本周推特和前端圈的一个热点,有不少人在争相模仿它的实现,如果你对跨窗口的渲染有兴趣,可…

linux 安装go环境

下载go SDK All releases - The Go Programming Language 此处建议选择与本机windows一样的版本,便于调试,若不涉及本地windows,则忽略此提示 上传到linux 解压go SDK 执行下述命令进行解压 tar -xvf go1.19.linux-amd64.tar.gz 此处选择…

tcp/ip协议 error=10022 Winsock.reg Winsock2.reg

tcp/ip协议 error10022 这2个注册表选项千万不能删除,否则上不了网。 按下windows键R键,输入regedit,打开注册表,在文件目录里找到如下两个文件夹,删除这两个文件夹。 路径:HKEY_LOCAL_MACHINE\System\C…

12.二维字符数组——输出basic和BASIC

文章目录 前言一、题目描述 二、题目分析 三、解题 程序运行代码 前言 本系列为二维字符数组编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 输出basic和BASIC 二、题目分析 法一&#xff1a; for(i0;i<1;i){ for(j0;j<6;j){ putchar(a[i][j]); pri…

RxJava

Single 使用 Flowable 比较重一般使用Single onSubscribe 产生订阅时调用 线程切换1 2 发送顺序事件.just just 源码 钩子方法,进行验证再处理 Single 对象 订阅,RxJavaPlugins.onSubscribe 钩子方法,产生订阅和过滤 Single 核心方法,抽象的,实现为SingleJust 订阅和执行成功回…