from SALib.sample import saltelli
import numpy as np
problem = {
'num_vars': 3,
'names': ['x1', 'x2', 'x3'],
'bounds': [-10,10]
}
必须bounds
进行统一分发吗?它可能是其他概率分布吗?如正常,二元,泊松,Beta ......
答案 0 :(得分:1)
如果您想要SALib
以外的其他发行版,您可以执行以下操作:
scipy
进行转换,这应该为分发提供足够的灵活性。以下转换为正常分布的示例基于从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']
}
然后以“界限”给出的值对应于每个分布的参数,例如正态分布情况下的均值和标准差。可以在博客文章中找到更多详细信息。