gpt4 book ai didi

python - 在 astropy.modeling 中绑定(bind)参数

转载 作者:行者123 更新时间:2023-12-03 17:37:33 28 4
gpt4 key购买 nike

我正在尝试使用 Model.tied (或 Parameter.tied )属性在 astropy.modelling 中,但似乎无法弄清楚它是如何工作的。例如,假设我想创建一个具有两个参数的复合模型:flux_0flux_1 .但是,我只想要 flux_0用于装配:flux_1应始终携带值 1 - flux_0 . (最终,我需要扩展此功能以便 flux_0 + flux_1 + ... + flux_n = 1 。)

我为 tied 定义了一个模型类和一个“可调用”类。像这样的属性:

>>> from astropy.modeling import Fittable1DModel, Parameter
>>>
>>> class MyModel(Fittable1DModel):
... flux = Parameter()
... @staticmethod
... def evaluate(x, flux):
... return flux
...
>>> def tie_fluxes(model):
... flux_1 = 1 - model.flux_0
... return flux_1
...
>>> TwoModel = MyModel + MyModel
>>>
>>> TwoModel
<class '__main__.CompoundModel0'>
Name: CompoundModel0
Inputs: ('x',)
Outputs: ('y',)
Fittable parameters: ('flux_0', 'flux_1')
Expression: [0] + [1]
Components:
[0]: <class '__main__.MyModel'>
Name: MyModel
Inputs: ('x',)
Outputs: ('y',)
Fittable parameters: ('flux',)

[1]: <class '__main__.MyModel'>
Name: MyModel
Inputs: ('x',)
Outputs: ('y',)
Fittable parameters: ('flux',)

然后我检查 tied属性。我的理解是这应该是一本字典(见脚注),但它不是:
>>> TwoModel.tied
<property object at 0x109523958>
>>>
>>> TwoModel.tied['flux_1'] = tie_fluxes
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'property' object does not support item assignment

如果我尝试将其设置为字典,它不会更新相应的 Parameter :
>>> TwoModel.tied = {'flux_1': tie_fluxes}
>>>
>>> TwoModel.flux_1.tied
False

但是当我尝试立即创建一个对象而不是一个复合模型类(这不是我最终想要做的)时,该对象的 tied属性是一个字典。不幸的是,设置这个字典仍然不能产生预期的效果:
>>> TwoSetModel = MyModel(0.2) + MyModel(0.3)
>>>
>>> TwoSetModel
<CompoundModel1(flux_0=0.2, flux_1=0.3)>
>>>
>>> TwoSetModel.tied
{'flux_1': False, 'flux_0': False}
>>>
>>> TwoSetModel.tied['flux_1'] = tie_fluxes
>>>
>>> TwoSetModel
<CompoundModel1(flux_0=0.2, flux_1=0.3)>
>>>
>>> TwoSetModel.flux_1.tied
<function tie_fluxes at 0x102987730>

所以在这个例子中, tied属性确实具有正确的功能,但参数的 value不会相应更新。

我在这里做错了什么?我是不是完全误解了 tied属性?

(我在上面的例子中使用 Python 3.5.2 和 Astropy 1.3.3)

脚注:

运行 help(TwoModel) ,我得到以下信息:

| tied : dict, optional
| Dictionary ``{parameter_name: callable}`` of parameters which are
| linked to some other parameter. The dictionary values are callables
| providing the linking relationship.
|
| Alternatively the `~astropy.modeling.Parameter.tied` property of a
| parameter may be used to set the ``tied`` constraint on individual
| parameters.

| Examples
| --------
| >>> from astropy.modeling import models
| >>> def tie_center(model):
| ... mean = 50 * model.stddev
| ... return mean
| >>> tied_parameters = {'mean': tie_center}
|
| Specify that ``'mean'`` is a tied parameter in one of two ways:
|
| >>> g1 = models.Gaussian1D(amplitude=10, mean=5, stddev=.3,
| ... tied=tied_parameters)
|
| or
|
| >>> g1 = models.Gaussian1D(amplitude=10, mean=5, stddev=.3)
| >>> g1.mean.tied
| False
| >>> g1.mean.tied = tie_center
| >>> g1.mean.tied
| <function tie_center at 0x...>

最佳答案

下面的示例类似于 astropy 文档中给出的示例。

复合模型=两个一维高斯函数之和。

约束:mean_1=2*mean_0

import numpy as np
import matplotlib.pyplot as plt
from astropy.modeling import models, fitting


def tie_center(model):
mean = 2* model.mean_0
return mean

tied_parameters = {'mean_1': tie_center}
np.random.seed(42)
g1 = models.Gaussian1D(2, 0.4, 0.3)
g2 = models.Gaussian1D(2.5, 0.2, 0.2)
TwoGaussians = (models.Gaussian1D +
models.Gaussian1D).rename('TwoGaussians')
x = np.linspace(-1, 1, 200)
y = g1(x) + g2(x) + np.random.normal(0., 0.2, x.shape)

gg_init = TwoGaussians(amplitude_0=1.4, mean_0=1.2, stddev_0=0.1,\
amplitude_1=1.0,stddev_1=0.2, tied=tied_parameters)
fitter = fitting.SLSQPLSQFitter()
gg_fit = fitter(gg_init, x, y)


plt.figure(figsize=(8,5))
plt.plot(x, y, 'ko')
plt.plot(x, gg_fit(x))
plt.xlabel('Position')
plt.ylabel('Flux')
plt.show()
print(gg_fit.mean_0,gg_fit.mean_1)

当 Compund_model= 三个 1D 高斯函数之和时,在 astropy 中绑定(bind)参数
约束:所有三种方法的总和应始终等于一。
def tie_center(model):
mean = 1-(model.mean_0+ model.mean_1)
return mean
tied_parameters = {'mean_2': tie_center}

np.random.seed(42)
g1 = models.Gaussian1D(2, 0.4, 0.3)
g2 = models.Gaussian1D(2.5, 0.2, 0.2)
g3 = models.Gaussian1D(1.5, 0.4, 0.1)
ThreeGaussians = (models.Gaussian1D + models.Gaussian1D +
models.Gaussian1D).rename('ThreeGaussians')
x = np.linspace(-1, 1, 200)
y = g1(x) + g2(x) + g3(x) + np.random.normal(0., 0.2, x.shape)

gg_init = ThreeGaussians(amplitude_0=1.4, mean_0=0.3, stddev_0=0.1,
amplitude_1=1.0, mean_1=0.3,stddev_1=0.2, \
amplitude_2=1.5,stddev_2=0.1,tied=tied_parameters)
fitter = fitting.SLSQPLSQFitter()
gg_fit = fitter(gg_init, x, y)
plt.figure(figsize=(8,5))
plt.plot(x, y, 'ko')
plt.plot(x, gg_fit(x))
plt.xlabel('Position')
plt.ylabel('Flux')
plt.show()
print(gg_fit.mean_0,gg_fit.mean_1, gg_fit.mean_2)

关于python - 在 astropy.modeling 中绑定(bind)参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45513897/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com