在 python 中为具有两个变量的函数查找优化的函数参数

问题描述 投票:0回答:1

我是新来的,也是 python 的新手。我意识到 python 可以成为优化曲线和拟合数据的强大工具,所以我来了。我有一些 VBA 经验,所以我对编程有一些常识。我有一个问题,我会尽量向你描述它。

我有一个直线系统,它有不同的斜率和不同的截距。每条线代表第二个参数不变的条件。

例如:

  • x1[0,1,2,3,4] y1[1,2,3,4,5] 和 z1[1,1,1,1,1] 第一行,
  • x2[0,1,2,3,4] , y2[2,4,6,8,10] 和 z2[2,2,2,2,2] 第二行和
  • x3[0,1,2,3,4], y3[3,6,9,12,15] 和 z3[3,3,3,3,3] 第三行。

为了在一个函数中表达这些变量,我可以用 z 表示斜率和截距,因此所有三条线的组合函数为:

y=(a1*z+b1)*x+(a2*z+b2)
a1=1, b1=0, a2=1, b2=0

是否可以从 python 代码中获取 a1、b1、a2 和 b2 的值?

我问这个非常简单的例子,因为实际上我有测量数据,因此数据通常会有一点波动。

我想尝试一下描述斜率和截距的函数,以最好地优化整个数据集。我知道我想将常量 z 的线描述为线性,并且我希望拥有最合适的通用函数来描述我的数据。描述斜率的函数可以是线性的或其他任何东西。

我要测试,哪个最合适。如果我更改斜率函数,例如 z1=const 的一组数据点。不会那么合身,而另一套用z2=const。会更好等等,这样我最终对整个数据集的误差可能最小。我希望这对你有意义。如果你冷告诉我这是否可能以及我需要如何构建我的代码,我会很高兴。

我可以容纳多少行有限制吗?有时我有 5 个,有时有 15 个。

提前谢谢你! :)

我试图在 excel 中获得优化版本,但我认为这需要很长时间!此外,视觉分析不如数学分析,减少多行错误对我来说很困难。

python optimization curve-fitting
1个回答
0
投票

这是一个非常简单的线性代数问题:

import numpy as np
from numpy.linalg import lstsq

'''
x1[0,1,2,3,4], y1[1,2,3,4,5]   and z1[1,1,1,1,1] for the first line,
x2[0,1,2,3,4], y2[2,4,6,8,10]  and z2[2,2,2,2,2] for the second line and
x3[0,1,2,3,4], y3[3,6,9,12,15] and z3[3,3,3,3,3]

y=(a1*z + b1)*x + (a2*z + b2) with a1=1, b1=0, a2=1, b2=0

[xz z x 1][a1] = [y]
[xz z x 1][a2]   [y]
[xz z x 1][b1]   [y]
[xz z x 1][b2]   [y]
[xz z x 1]       [y]
[...     ]       [...]
'''

x = np.array((0, 1, 2, 3, 4, 0, 1, 2, 3,  4, 0, 1, 2,  3,  4))
y = np.array((1, 2, 3, 4, 5, 2, 4, 6, 8, 10, 3, 6, 9, 12, 15))
z = np.array((1, 1, 1, 1, 1, 2, 2, 2, 2,  2, 3, 3, 3,  3,  3))

a = np.stack((
    x*z, z, x, np.ones_like(x),
), axis=1)

params, *_ = lstsq(a, y)
print(params)
print(a @ params)
[ 1.00000000e+00  1.00000000e+00 -8.11406854e-16  3.35250086e-15]
[ 1.  2.  3.  4.  5.  2.  4.  6.  8. 10.  3.  6.  9. 12. 15.]
© www.soinside.com 2019 - 2024. All rights reserved.