您可以确保拟合的概率分布是通过数值积分进行归一化的。例如,假设您有数据x和y,并且您已经为概率分布定义了一个带有参数a和b的unnormalised_function(x, a, b),该概率分布定义在x1到x2的区间上(该区间可以是无穷大):
from scipy.optimize import curve_fit
from scipy.integrate import quad
# Define a numerically normalised function
def normalised_function(x, a, b):
normalisation, _ = quad(lambda x: unnormalised_function(x, a, b), x1, x2)
return unnormalised_function(x, a, b)/normalisation
# Do the parameter fitting
fitted_parameters, _ = curve_fit(normalised_function, x, y)
5条答案
按热度按时间ecr0jaav1#
您可以定义自己的残差函数,包括惩罚参数,如下面的代码所示,其中预先知道沿区间的积分必须为
2.
。如果您在没有惩罚的情况下进行测试,您将看到您得到的是常规的curve_fit
:其他相关问题:
fcipmucu2#
下面是一个几乎相同的代码片段,它只使用了
curve_fit
。cczfrluj3#
下面的示例是添加任何约束的更通用的方法:
违反约束:-2.9179325622408214e-10
wlwcrazw4#
如果你能预先对概率拟合函数进行归一化处理,那么你就可以使用这个信息来约束拟合。一个非常简单的例子就是对数据进行高斯拟合。如果要拟合以下三参数(A,mu,sigma)高斯函数,那么它通常是未归一化的:
然而,如果改为对A:
则高斯仅为两个参数并且被自动归一化。
2ul0zpep5#
您可以确保拟合的概率分布是通过数值积分进行归一化的。例如,假设您有数据
x
和y
,并且您已经为概率分布定义了一个带有参数a
和b
的unnormalised_function(x, a, b)
,该概率分布定义在x1
到x2
的区间上(该区间可以是无穷大):