如果你想其他的发行除了从SALib
均匀,你可以做到以下几点:在区间(0,1)
- 生成均匀的样品。
- 使用反向累积分布函数将每个参数的输入转换为期望的分布。您可以使用
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)