基于python_Salib库的模型敏感度分析及置信区间划分(含实例)

敏感度分析的基础概念

通俗解释
  • 敏感度分析是指对一个模型输出中的不确定性进行研究,并进一步判断不确定性的来源,也就是研究哪个输入参数的改变造成的输出变化的程度大小. 所以灵敏度分析是进行数学建模过程中一个必不可少的常规步骤。
详细解释
  1. 针对相关输入变量,将相关变量利用Mara方法转换为独立变量,推导了特定多项式形式下各变量输出方差贡献对其分布参数灵敏度的解析解,得到了正态相关输入变量的分布参数对方差贡献影响的一般性规律.此外,基于已有的基于方差的重要性测度分解指标,推导了特定多项式形式下正态相关输入变量对输出响应方差贡献的结构贡献部分和相关贡献部分的解析表达.分析所研究的指标和已有的指标的内涵,归纳出不同指标的区别与联系.

  2. 针对输入变量相关且同时存在主观和客观不确定性的结构系统,开展输入变量分布参数的主观不确定性对系统输出响应影响的研究.其次,验证了主,客观不确定性分离前后输入变量分布参数对模型输出响应的各阶方差贡献的相等关系.此外,针对输入变量包含主,客观不确定性的情况开展了模型确认的方法研究,基于无模型抽样的概念提出G确认指标.G指标是对计算模型和物理数据的直接比较,避免了信息损失,而且输出维数的增加及考虑不同来源的不确定性均不会增加其估计难度.

  3. 针对现有的模型确认指标普遍忽略局部信息的现状,在全局信息模型确认的研究基础上,深入探讨计算模型与物理实验之间局部信息的差异.基于高维模型代理,提出对输出分量函数进行模型确认的方法,在已有对计算模型和物理试验全局差异衡量的基础上,增加了对局部信息差异的评价,极大地丰富了模型确认的内涵.同时,为减小计算模型与物理实验之间的局部信息的差异,提出基于输出分量函数视角的模型参数校准方法,提高了模型的可信性.此外,从输入变量的角度出发,考虑变量处于不同输入区间时的局部信息的模型确认过程,提出了面积指标和G指标下的区域模型确认概念.同时,提出区域模型确认对全局模型确认的贡献(contribution to whole validation(CWV))指标,建立两类模型确认过程之间的联系,量化区域确认对全局模型确认的影响和贡献,深化对两类模型确认的理解.

置信区间的基础概念

点估计与区间估计
  • 点估计的含义:
    是用样本统计量来估计总体参数,因为样本统计量为数轴上某一点值,估计的结果也以一个点的数值表示,所以称为点估计。点估计虽然给出了未知参数的估计值,但是未给出估计值的可靠程度,即估计值偏离未知参数真实值的程度。
  • 区间估计:
    给定置信水平,根据估计值确定真实值可能出现的区间范围,该区间通常以估计值为中心,该区间则为置信区间。
中心极限定理与大数定理
  • 中心极限定理:
    指概率论中讨论随机变量序列部分和分布渐近于正态分布的一类定理。指出了大量随机变量近似服从正态分布的条件。在自然界与生产中,一些现象受到许多相互独立的随机因素的影响,如果每个因素所产生的影响都很微小时,总的影响可以看作是服从正态分布的。中心极限定理就是从数学上证明了这一现象。最早的中心极限定理是讨论重点,伯努利试验中,事件A出现的次数渐近于正态分布的问题

  • 大数定理:
    取样数趋近无穷时,样品平均值按概率收敛于期望值。抛硬币的次数越多,越接近正反各一半。

置信区间与置信水平

一般我们用中括号[a,b]表示样本估计总体平均值误差范围的区间。a、b的具体数值取决于你对于”该区间包含总体均值”这一结果的可信程度,因此[a,b]被称为置信区间。
一般来说,选定某一个置信区间,我们的目的是为了让”ab之间包含总体平均值”的结果有一特定的概率,这个概率就是所谓的置信水平。
例如我们最常用的95%置信水平,就是说做100次抽样,有95次的置信区间包含了总体均值。

标准差(standard deviation)与标准误差(standard error)
  • 标准差
    标准差是描述观察值(个体值)之间的变异程度(例如一个人打十次靶子的成绩,这时有一个平均数8,有一个反映他成绩稳定与否的标准差);
  • 标准误差
    标准误是描述样本均数的抽样误差(例如十次抽样,每次他成绩平均数(7,8,6,9,5,6,7,7,8,9)的标准差,也就是抽样分布的标准差);
    样本的标准误差为:
    S E = s ( 样 本 标 准 差 ) n SE = \frac{s(样本标准差)}{\sqrt n} SE=n s()
理解95%的置信区间

以上面的统计身高为例,假设全国人民的身高服从正态分布:
X − N ( μ , σ 2 ) X - N(\mu, \sigma^{2}) XN(μ,σ2)
不断进行采样,假设样本的大小为n,则样本的均值为:
M = X 1 + X 2 + . . . + X n n M = \frac{X_1 + X_2 + ... + X_n}{n} M=nX1+X2+...+Xn
由大数定理与中心极限定理:
X − N ( μ , σ 1 2 ) X - N(\mu, \sigma_1^{2}) XN(μ,σ12)

  • 为什么常用95%的置信水平:

基于python_Salib库的模型敏感度分析及置信区间划分(含实例)_第1张图片
P ( μ − 1.96 μ n < M < μ + 1.96 μ n ) = 0.95 P(\mu - 1.96\frac{\mu}{\sqrt n} < M < \mu + 1.96\frac{\mu}{\sqrt n}) = 0.95 P(μ1.96n μ<M<μ+1.96n μ)=0.95

示例

# 模型灵敏度分析
from SALib.sample import saltelli
from SALib.analyze import sobol
from SALib.test_functions import Ishigami
import numpy as np
import math

# 定义模型输入
"""
定义模型输入。Ishigami功能具有三个输入, x1,x2,x3 哪里 xi∈[−π,π]。
在SALib中,我们定义了一个dict定义输入的数量,输入的名称以及每个输入的边界,
如下所示
"""
problem = {
    'num_vars': 3,
    'names': ['x1', 'x2', 'x3'],
    'bounds': [[-3.14159265359, 3.14159265359],
               [-3.14159265359, 3.14159265359],
               [-3.14159265359, 3.14159265359]]
}

def evaluate(X):
    """
        要进行灵敏度分析的模型,接受一个数组,每个数组元素作为模型的一个输入,
        将输入的x映射为一个y,通过数组返回
        y = sin(x1) + x2*cos(2*x3)
    """
    return np.array([math.sin(x[0]) + x[1] * math.cos(2 * x[2]) for x in X])
	
# 样本生成
"""
    param_values是一个NumPy矩阵。如果运行 param_values.shape,
    我们将看到矩阵乘以3等于8000。Saltelli采样器生成了8000个样本。
    Saltelli采样器生成 N∗(2D+2)样本,在此示例中,N为1000(我们提供的参数),
    D为3(模型输入的数量)
"""
param_values = saltelli.sample(problem,1000)

# 运行模型
Y = evaluate(param_values)
print(param_values.shape,Y.shape)
Si = sobol.analyze(problem,Y,print_to_console=True)
print()

# 一阶灵敏度
print('S1:', Si['S1']) 

# 二阶林敏度
print("x1-x2:", Si['S2'][0, 1])
print("x1-x3:", Si['S2'][0, 2])
print("x2-x3:", Si['S2'][1, 2])

"""
    置信区间: 对这个样本的某个总体参数的区间估计,置信区间展现的是这个参数的真实值有一定概率落在测量结果的周围的程度。
             置信区间给出的是被测量参数的测量值的可信程度。一般常取为95%或者90%或者99%.是预先取定的值.
             如:如果在一次大选中某人的支持率为55%,而置信水平0.95上的置信区间是(50%,60%),那么他的真实支持率有百分之九十五的机率落在百分之五十和百分之六十之间
    显著性水平: 一个预先取定的值(一般取0.05/0.01),一般用alpha表示.跟置信概率恰好方向相反(加起来是1),在假设检验中表示在零假设成立下拒绝它所犯的一类错误的上界.在用p值检验时,
              如果p值比显著性水平小,就可以放心拒绝原假设.反之,不拒绝.
    置信度: 置信区间上下限的差值。
"""
from SALib.plotting.bar import plot as barplot
import matplotlib.pyplot as plot

Si_df = Si.to_df()
barplot(Si_df[0])
plot.show()

基于python_Salib库的模型敏感度分析及置信区间划分(含实例)_第2张图片

Python 数学建模与超级可视化
相关变量灵敏度分析及模型确认方法研究
SALib官网

你可能感兴趣的:(数学建模,python,机器学习,数据分析,数学建模)