SAlib(灵敏度分析)包是否仅支持一个列(向量)输入?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SAlib(灵敏度分析)包是否仅支持一个列(向量)输入?相关的知识,希望对你有一定的参考价值。
我想用作SAlib分析(SOBOL)参数的模型输出数组的形状不符合sobol需要的数组形状。
- 我有一个参数数组,其形状为(28,13),由SAlib包的saltelli函数生成。
- 另一方面,我的模型在许多时间点计算解决方案,比如200.所以最后我有一个输出数组(28,200)
- 我必须使用此输出数组作为SAlib的Sobol函数的参数。
- 但据我所知,从SAlib的doc中的例子来看,Sobol的输入参数必须有一个列数组,如(28,)
我想学习的是,我是否从SAlib的文档中推断出正确的结论,因为SAlib的Sobol函数只需要一个列数组?或者我可以用(28,200)数组喂它吗?
PS:实际上我试过(28,200)并且遇到了一些错误。但我不确定SAlib是否支持(28,200)的数组形状或者我的代码是否有错误。
from SALib.sample import saltelli
from SALib.analyze import sobol,morris
from SALib.test_functions import Ishigami
input_dict = {}
problem = {'num_vars':13,'names':
['Rp1','Ra','Rv','Rp2','Cla','Csa','Clv','Csv','Emin','Emax','R1','R2','C1'],\
'bounds':[[1.0,2.0],[0.1,0.5],[0.01,0.1],[11.0,15.0],[0.1,1.5],[0.05,0.55],[30.0,50.0],[2.0,6.0],\
[0.001,0.45],[0.2,3.2],[25.0,42.0],[2.0,8.0],[15.0,19.0]]}
param_values = saltelli.sample(problem,1)
for count, param in enumerate(param_values):
input_dict[count] = param
kwargs = {}
kwargs['newly_defined_parameters']= input_dict
sol_dict = main(**kwargs) # main function solves the model and returns a solution dictionary
我的模型产生8个输出。但我想只对1个输出进行灵敏度分析。所以我把输出数据加载到my_sol数组中。
my_sol = np.zeros((28,200))
for ps in range(28): #ps ---> parameter set
for tp in range(200): #tp ---> time point
my_sol[ps][tp]=sol_dict[ps][1][tp]
my_sol.shape
(28, 200)
现在分析部分:
Si = sobol.analyze(problem,my_sol)
现在错误部分:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-39-ab30c1d4df01> in <module>
----> 1 Si = sobol.analyze(problem,my_sol)
C:\ProgramData\Anaconda3\lib\site-packages\SALib\analyze\sobol.py in analyze(problem, Y, calc_second_order, num_resamples, conf_level, print_to_console, parallel, n_processors, seed)
101
102 for j in range(D):
--> 103 S['S1'][j] = first_order(A, AB[:, j], B)
104 S['S1_conf'][j] = Z * first_order(A[r], AB[r, j], B[r]).std(ddof=1)
105 S['ST'][j] = total_order(A, AB[:, j], B)
ValueError: setting an array element with a sequence.
答案
使用SAlib,我无法对我的模型的时间序列输出进行灵敏度分析,该模型是(28,200)的数组。相反,我试过两种不同的方式。
1st:我为evey时间点制作了SA,因此我能够在模型运行时绘制参数的灵敏度变化。而且我通过这种方式计算了灵敏度指数的平均值,我得到了最终的SA指数。
第二:我计算了每个时间序列的平均值,并为这些最终平均值做了SA。
(第一个选项以更合理的解决方案结束)
https://github.com/SALib/SALib/issues/233
以上是关于SAlib(灵敏度分析)包是否仅支持一个列(向量)输入?的主要内容,如果未能解决你的问题,请参考以下文章
在 R 中编程灵敏度分析:改变 1 个参数(列),保持其他参数不变。更好的方法?
是否可以仅基于一张表在 Oracle BI OBIEE 中创建分析?