在灵敏度分析中输入参数时,SALib是否支持其他概率分布?

时间:2017-07-24 12:08:02

标签: python model

from SALib.sample import saltelli
import numpy as np

problem = {
  'num_vars': 3, 
  'names': ['x1', 'x2', 'x3'], 
  'bounds': [-10,10]
}

必须bounds进行统一分发吗?它可能是其他概率分布吗?如正常,二元,泊松,Beta ......

2 个答案:

答案 0 :(得分:1)

如果您想要SALib以外的其他发行版,您可以执行以下操作:

  1. 在区间(0,1)上生成均匀样本。
  2. 使用逆累积分布函数将每个参数的输入转换为所需的分布。您可以使用scipy进行转换,这应该为分发提供足够的灵活性。
  3. 使用这些转换后的输入评估模型。
  4. 以下转换为正常分布的示例基于从SALib网站(https://github.com/SALib/SALib)修改的代码。

    from SALib.sample import saltelli
    from SALib.analyze import sobol
    from SALib.test_functions import Ishigami
    import numpy as np
    import scipy as sp # for inverse CDF (ppf) function for distributions
    
    problem2 = {
      'num_vars': 3,
      'names': ['x1', 'x2', 'x3'],
      'bounds': [[0,1]]*3
    }
    
    # Generate samples
    param_values2 = saltelli.sample(problem2, 1000, calc_second_order=False)
    
    # using normal inverse CDF, can change to other distributions as desired
    # look at scipy documentation for other distributions and parameters
    param_values2[:,0] = sp.stats.norm.ppf(param_values2[:,0],0,np.pi/2.)
    param_values2[:,1] = sp.stats.norm.ppf(param_values2[:,1],0,np.pi/2.)
    param_values2[:,2] = sp.stats.norm.ppf(param_values2[:,2],0,np.pi/2.)
    
    # Run model (example)
    Y = Ishigami.evaluate(param_values2)
    
    # Perform analysis
    Si = sobol.analyze(problem2, Y, print_to_console=True)
    

答案 1 :(得分:1)

我想补充卡尔文·惠顿的答案,该答案基于卡尔文·惠顿的this blog post

SALib支持在问题字典中定义不同的输入参数分布,尽管该功能似乎未在其官方网站上记录。 您只需要在问题字典中添加新的密钥'dists'并给出编码分布类型的字符串列表即可。

在这种情况下,问题定义如下:

# problem definition
prob_dists_code = {
'num_vars':6,
'names': ['P1','P2','P3','P4','P5','P6'],
'bounds':[[0.0,1.0], [1.0, 0.75], [0.0, 0.2], [0.0, 0.2], [-1.0,1.0], [1.0,0.25]],
'dists':['unif','triang','norm','lognorm','unif','triang']
}

然后以“界限”给出的值对应于每个分布的参数,例如正态分布情况下的均值和标准差。可以在博客文章中找到更多详细信息。