2017-07-24 74 views

回答

1

如果你想其他的发行除了从SALib均匀,你可以做到以下几点:在区间(0,1)

  1. 生成均匀的样品。
  2. 使用反向累积分布函数将每个参数的输入转换为期望的分布。您可以使用scipy进行转换,这应该为分发提供很大的灵活性。
  3. 用这些转换后的输入评估模型。

以下转换为正常分布的示例基于从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)