【发布时间】:2022-01-21 16:10:53
【问题描述】:
考虑以下 MWE
import numpy as np
from scipy.optimize import curve_fit
X=np.arange(1,10,1)
Y=abs(X+np.random.randn(15,9))
def linear(x, a, b):
return (x/b)**a
coeffs=[]
for ix in range(Y.shape[0]):
print(ix)
c0, pcov = curve_fit(linear, X, Y[ix])
coeffs.append(c0)
XX=np.tile(X, Y.shape[0])
c0, pcov = curve_fit(linear, XX, Y.flatten())
我有一个问题,我基本上必须这样做,但不是 15 次迭代,而是数千次,而且速度很慢。
有没有办法用curve_fit 一次性完成所有这些迭代?我知道函数的结果应该是一维数组,所以只需像这样传递参数
c0, pcov = curve_fit(nlinear, X, Y)
不会工作。另外我认为答案必须是扁平化Y,所以我可以得到扁平化的结果,但我无法得到任何工作。
编辑
我知道如果我做类似的事情
XX=np.tile(X, Y.shape[0])
c0, pcov = curve_fit(nlinear, XX, Y.flatten())
然后我得到系数的“平均”值,但这不是我想要的。
编辑 2
为了记录,我使用 Jacques Kvam 的设置解决了问题,但使用 Numpy 实现(由于限制)
lX = np.log(X)
lY = np.log(Y)
A = np.vstack([lX, np.ones(len(lX))]).T
m, c=np.linalg.lstsq(A, lY.T)[0]
然后m 是a 并得到b:
b=np.exp(-c/m)
【问题讨论】:
-
函数
linear是您想要拟合的实际函数,还是更复杂函数的简化? -
@WarrenWeckesser 这是实际功能。 (是的,关于名字,我本来打算做一个线性例子,但在最后一刻改变了,我的错!)
-
好的,谢谢。还有一个迂腐的问题:在您的示例中,您通过将
randn()创建的噪声添加到X来创建Y。这意味着Y可能有负值。你的真实数据可能有负值吗?另外,真正的Y可以包含 0 吗? -
我撒了谎——还有一个问题(但它确实是上一个问题的一部分):在你的真实数据中,
X是否包含 0? -
可以接受对数并使用线性最小二乘吗?