添加对模型中单元的支持(高级)#

评价#

为了使您的模型可以接受带单位的参数并使用带单位的输入进行计算,您需要确保 evaluate() 方法可以正确处理输入值和带单位的参数。对于简单的算术,这可能是开箱即用的,因为 Quantity 对象可以被许多Numpy函数理解。

如果模型的用户在计算期间提供了与参数单位不兼容的输入,则他们可能会得到诸如:

UnitsError : Can only apply 'subtract' function to dimensionless quantities
when other argument is not a quantity (unless the latter is all
zero/infinity/nan)

可以在模型上设置多个属性或属性,这些属性可以用单位调整模型的行为。这些属性可以从类定义中的默认值更改,例如:

class MyModel(Model):
    input_units = {'x': u.deg}
    ...

请注意,这些都是可选的。

input_units#

通过添加 input_units 属性或模型类上的属性。这应该会返回 None (表示没有约束)或一个字典,其中键是输入名称(例如。 x 对于许多1D模型),值是预期的单位,它可以是参数单位的函数:

@property
def input_units(self):
    if self.mean.unit is None:
        return None
    else:
        return {'x': self.mean.unit}

如果用户随后给出的值的输入单位不正确,则会显示一个明确的错误:

UnitsError: Units of input 'x', (dimensionless), could not be converted to
required input units of m (length)

请注意,输入单元不必与 input_units ,但可以转换成它们。此外, input_units 在简单情况下,也可以指定为属性而不是属性:

input_units = {'x': u.deg}

return_units#

类似于 input_units ,这应该是将模型的返回值映射到单位的字典。如果 evaluate() 使用数量调用,但返回无单位值,则将单位添加到输出中。如果返回值是以不同单位表示的数量,则它们将转换为 return_units .

input_units_strict#

如果设置为 True ,以兼容单位传递的值将转换为中指定的精确单位 input_units .

此属性也可以是一个字典,它将输入名称映射为布尔值,以便将输入转换为指定的单位。

input_units_equivalencies#

可以将其设置为将输入名称映射到等效列表的字典,例如:

input_units_equivalencies = {'nu': u.spectral()}

_input_units_allow_dimensionless#

如果设置为 True ,可以传递普通标量或Numpy数组的值来计算 input_units 指定输入应具有单位。就这样吧 evaluate() 然后决定如何处理这些无量纲值。该属性还可以是一个字典,它将输入名称映射到布尔值,以允许将无量纲值传递到 evaluate() 为了这个输入。

适合的#

若要允许具有具有单位的参数的模型与具有单位的数据拟合,需要添加一个名为 _parameter_units_for_data_units 去你的模特班。这需要两个参数 input_unitsoutput_units - input_units 将被设置为一个字典,其中以数据中的自变量为单位,而 output_units 将设置为字典,其中包含数据中因变量的单位(例如,对于简单的1D模型, input_units 只有一把钥匙, xoutput_units 只有一把钥匙, y ). 然后,该方法应返回一个字典,为每个参数提供参数应转换为的单位,以便在从模型和数据中删除单位时,模型可用于数据。以下示例显示了1D高斯函数的实现:

def _parameter_units_for_data_units(self, inputs_unit, outputs_unit):
    return {'mean': inputs_unit['x'],
            'stddev': inputs_unit['x'],
            'amplitude': outputs_unit['y']}

有了这种方法,模型就可以适应具有单位的数据。