Tôi đang cố gắng sử dụng thuộc tính Model.tied
(hoặc Parameter.tied
) trong astropy.modelling, nhưng dường như không thể hiểu cách hoạt động của nó. Ví dụ: giả sử tôi muốn tạo mô hình kết hợp với hai tham số: flux_0
và flux_1
. Tuy nhiên, tôi chỉ muốn flux_0
được sử dụng trong phù hợp: flux_1
phải luôn mang giá trị 1 - flux_0
. (Cuối cùng, tôi cần phải mở rộng chức năng này để flux_0 + flux_1 + ... + flux_n = 1
.)Các thông số lấy mẫu trong astropy.modeling
tôi định nghĩa một lớp mô hình và một "callable" cho thuộc tính tied
như vậy:
>>> 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',)
Sau đó, tôi kiểm tra thuộc tính tied
. Theo tôi hiểu rằng đây phải là một từ điển (xem chú thích), nhưng nó không phải là:
>>> 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
Nếu tôi cố gắng thiết lập nó như một cuốn từ điển, nó không cập nhật phù hợp Parameter
:
>>> TwoModel.tied = {'flux_1': tie_fluxes}
>>>
>>> TwoModel.flux_1.tied
False
Nhưng khi tôi cố gắng tạo một đối tượng ngay trên con dơi thay vì một lớp mô hình phức hợp (đây không phải là những gì tôi muốn làm cuối cùng), thuộc tính tied
của đối tượng là một từ điển. Thật không may, thiết lập từ điển này vẫn không tạo ra hiệu quả mong muốn:
>>> 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>
Vì vậy, trong ví dụ này, các thuộc tính tied
không giữ chức năng chính xác, nhưng của value
tham số không cập nhật cho phù hợp.
Tôi đang làm gì sai ở đây? Tôi có hoàn toàn hiểu nhầm thuộc tính tied
không?
(Tôi đang sử dụng Python 3.5.2 với Astropy 1.3.3 trong các ví dụ trên)
Footnote:
Chạy help(TwoModel)
, tôi nhận được thông tin sau:
⁝
| 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...>
⁝
Câu hỏi hay - Tôi đã viết hầu hết mã này để tôi có thể trả lời câu hỏi của bạn. Tôi sắp đi ra ngoài trong ngày nhưng tôi sẽ cố gắng để lấy lại càng sớm càng tốt. IIRC đối phó với các ràng buộc với các mô hình hợp chất vẫn có thể là một chút khó khăn, không may. – Iguananaut
Một điều tôi có thể cho bạn biết bây giờ - bạn dường như rơi vào một quan niệm sai lầm phổ biến rằng các ràng buộc mô hình được áp dụng khi cập nhật thủ công các giá trị của tham số. Đây không phải là trường hợp.Các ràng buộc là * chỉ * được sử dụng bởi fitters khi lắp các mô hình, để thiết lập các ràng buộc trên các tham số. Bên ngoài các ràng buộc phù hợp không được thực thi. Tôi đã xem xét việc thay đổi điều này trước đây, để nó hoạt động theo cách bạn mong đợi. Đã có một vấn đề mở cho rằng tại một thời điểm nhưng tôi dường như không thể tìm thấy nó bây giờ ... – Iguananaut
Tôi nghĩ rằng https://github.com/astropy/astropy/issues/2265 làm cho một số tài liệu tham khảo này. – Iguananaut