使用 python 模块 lmfit 时 fit_params 的顺序是否重要?
Does the order of fit_params matter when using the python module lmfit?
我目前有以下参数需要优化['Knn', 'Kss', 'Ktt', 'tn', 'ts', 'tt', 'FE']
# Knn
fit_params.add('Knn', value = Knn_i, min=Knn_LB, max=Knn_UB, vary=True)
# Kss
fit_params.add('Kss', value = Kss_i, min=Kss_LB, max=Kss_UB, vary=True)
# Ktt
fit_params.add('Ktt', value = Ktt_i, min=Ktt_LB, max=Ktt_UB, vary=True)
# tn
fit_params.add('tn', value = tn_i, min=tn_LB, max=tn_UB, vary=True)
# ts
fit_params.add('ts', value = ts_i, min=ts_LB, max=ts_UB, vary=True)
# tt
fit_params.add('tt', value = tt_i, min=tt_LB, max=tt_UB, vary=True)
# FE
fit_params.add('FE', value = FE_i, min=FE_LB, max=FE_UB, vary=True)
结果会有所不同吗?我将顺序更改为 ['tn', 'FE', 'Knn', 'tt', 'Ktt', 'ts', 'Kss']
之类的话?有什么理由相信他们不会?
在 python 调试器中,我可以漂亮地打印 class 结构
IPdb [1]: pprint.pprint(fit_params)
Parameters([('Knn',
<Parameter 'Knn', value=1920120.3446234118, bounds=[1024:268435456]>),
('Kss',
<Parameter 'Kss', value=71663344.41919732, bounds=[1024:268435456]>),
('Ktt',
<Parameter 'Ktt', value=77146988.69681165, bounds=[1024:268435456]>),
('tn',
<Parameter 'tn', value=838.7989371561512, bounds=[8:1048576]>),
('ts',
<Parameter 'ts', value=976.643262263194, bounds=[8:1048576]>),
('tt', <Parameter 'tt', value=520.0015376886633, bounds=[8:32768]>),
('FE',
<Parameter 'FE', value=1.929e-06, bounds=[9.313225746154785e-10:1]>)])
但顺序似乎很重要。当我在每次迭代中查看每个参数的微小调整时,第一个参数“Knn”首先变化,“Kss”变化第二,最后一个是“FE”。
有什么方法可以混淆 class 对象的顺序吗?或者最好的方法就是按照我想要的顺序编写它们?
参数是有序的,因为它们必须映射到变量数组(即一维 numpy 数组)。该顺序仅在适合期间不能更改的意义上才重要。所以,是的,其中一个参数值将首先更改(并且可能始终是第一个定义的参数值,因为 Parameters 是有序字典的子类)。您应该能够通过简单地更改将条目添加到 Parameters 对象中的顺序来改变它。
但是任何拟合问题的结果都不应该取决于参数的顺序。
我目前有以下参数需要优化['Knn', 'Kss', 'Ktt', 'tn', 'ts', 'tt', 'FE']
# Knn
fit_params.add('Knn', value = Knn_i, min=Knn_LB, max=Knn_UB, vary=True)
# Kss
fit_params.add('Kss', value = Kss_i, min=Kss_LB, max=Kss_UB, vary=True)
# Ktt
fit_params.add('Ktt', value = Ktt_i, min=Ktt_LB, max=Ktt_UB, vary=True)
# tn
fit_params.add('tn', value = tn_i, min=tn_LB, max=tn_UB, vary=True)
# ts
fit_params.add('ts', value = ts_i, min=ts_LB, max=ts_UB, vary=True)
# tt
fit_params.add('tt', value = tt_i, min=tt_LB, max=tt_UB, vary=True)
# FE
fit_params.add('FE', value = FE_i, min=FE_LB, max=FE_UB, vary=True)
结果会有所不同吗?我将顺序更改为 ['tn', 'FE', 'Knn', 'tt', 'Ktt', 'ts', 'Kss']
之类的话?有什么理由相信他们不会?
在 python 调试器中,我可以漂亮地打印 class 结构
IPdb [1]: pprint.pprint(fit_params)
Parameters([('Knn',
<Parameter 'Knn', value=1920120.3446234118, bounds=[1024:268435456]>),
('Kss',
<Parameter 'Kss', value=71663344.41919732, bounds=[1024:268435456]>),
('Ktt',
<Parameter 'Ktt', value=77146988.69681165, bounds=[1024:268435456]>),
('tn',
<Parameter 'tn', value=838.7989371561512, bounds=[8:1048576]>),
('ts',
<Parameter 'ts', value=976.643262263194, bounds=[8:1048576]>),
('tt', <Parameter 'tt', value=520.0015376886633, bounds=[8:32768]>),
('FE',
<Parameter 'FE', value=1.929e-06, bounds=[9.313225746154785e-10:1]>)])
但顺序似乎很重要。当我在每次迭代中查看每个参数的微小调整时,第一个参数“Knn”首先变化,“Kss”变化第二,最后一个是“FE”。
有什么方法可以混淆 class 对象的顺序吗?或者最好的方法就是按照我想要的顺序编写它们?
参数是有序的,因为它们必须映射到变量数组(即一维 numpy 数组)。该顺序仅在适合期间不能更改的意义上才重要。所以,是的,其中一个参数值将首先更改(并且可能始终是第一个定义的参数值,因为 Parameters 是有序字典的子类)。您应该能够通过简单地更改将条目添加到 Parameters 对象中的顺序来改变它。
但是任何拟合问题的结果都不应该取决于参数的顺序。