我想使用自定义模型来拟合一些数据。我使用的语法是fit()
.我使用的数学模型的形式是这样的:
a*exp(-x*b)+c*exp(-y*d)+e*exp(-z*f)
其中a,b,c,d,e,f
是我将估计的参数,x,y,z
是自变量。(实际的数学公式更复杂,但像这样非线性。
拟合曲线时,如何添加a+c+e=1
的约束(a,c,e
必须为正或 0)?我知道如何设置下限和上限,但不知道如何将此归一化系数约束添加到拟合中。使用fit()
方法时是否可以执行此操作?
我想我已经在某处发布了这个,但现在找不到它。
由于它是非线性拟合,因此转换参数没什么大不了的。 假设我们选择了连续可微单调函数:
a = f(s) = 1/2 ( 1 + s / sqrt( 1 + s^2 ) )
所以对于(-inf, inf)
s
来说,(0,1)
a
.实际上,通过一些简单的移动和缩放,我们可以( u, v )
中获得任何a
。
现在我们可以对b
做同样的事情,但是通过额外的限制a + b + c = 1
我们知道最多c = 0
和b
必须明确小于1 - f(s) = 1/2 ( 1 - s / sqrt( 1 + s^2 ) )
。因此,现在是扩展的时候了,我们可以设置:
b = g(t, s) = 1/2 ( 1 - s / sqrt( 1 + s^2 ) ) 1/2 ( 1 + t / sqrt( 1 + t^2 ) )
再次与t
在(-inf, inf)
.第一部分是由于已经为a
设置的值而缩放,第二部分重复上面的过程。
最后,c
只是1- f(s) - g(t, s)
最终,带有参数s
和t
的 fit 函数如下所示:
+ 0.50 * ( 1 + s / sqrt( 1 + s^2 ) ) * exp( -x * b )
+ 0.25 * ( 1 - s / sqrt( 1 + s^2 ) ) * ( 1 + t / sqrt( 1 + t^2 ) ) * exp( -y * d )
+ (
+1.00
-0.50 * ( 1 + s / sqrt( 1 + s^2 )
-0.25 * ( 1 - s / sqrt( 1 + s^2 ) ) * ( 1 + t / sqrt( 1 + t^2 ) )
) * exp( -z * f )
获取s
和t
的结果可通过误差传播提供a
、b
和c