二维拟合 python
two dimensional fit with python
我需要拟合一个函数
z(u,v) = C u v^p
也就是说,我有一个二维数据集,我要找到两个参数,C和p。 numpy 或 scipy 中有什么东西可以直接做到这一点吗?我看了一下 scipy.optimize.leastsq,但我不清楚如何在这里使用它。
def f(x,u,v,z_data):
C = x[0]
p = x[1]
modelled_z = C*u*v**p
diffs = modelled_z - z_data
return diffs.flatten() # it expects a 1D array out.
# it doesn't matter that it's conceptually 2D, provided flatten it consistently
result = scipy.optimize.leastsq(f,[1.0,1.0], # initial guess at starting point
args = (u,v,z_data) # alternatively you can do this with closure variables in f if you like
)
# result is the best fit point
对于您的特定函数,您可能可以做得更好 - 例如,对于 p
的任何给定值,C
的一个最佳值可以通过简单的线性代数确定.
你可以把问题转化成一个简单的线性最小二乘问题,然后你就完全不需要leastsq()
了。
z[i] == C * u[i] * v[i]**p
变成
z[i]/u[i] == C * v[i]**p
然后
log(z[i]/u[i]) == log(C) + p * log(v[i])
改变变量,你可以解决一个简单的线性问题:
Z[i] == L + p * V[i]
使用 numpy
并假设您有数组 z
、u
和 v
中的数据,这将呈现为:
Z = log(z/u)
V = log(v)
p, L = np.polyfit(V, Z, 1)
C = exp(L)
您可能应该在其周围加上 try:
和 except:
,以防某些 u
值为零或存在负值。
我需要拟合一个函数
z(u,v) = C u v^p
也就是说,我有一个二维数据集,我要找到两个参数,C和p。 numpy 或 scipy 中有什么东西可以直接做到这一点吗?我看了一下 scipy.optimize.leastsq,但我不清楚如何在这里使用它。
def f(x,u,v,z_data):
C = x[0]
p = x[1]
modelled_z = C*u*v**p
diffs = modelled_z - z_data
return diffs.flatten() # it expects a 1D array out.
# it doesn't matter that it's conceptually 2D, provided flatten it consistently
result = scipy.optimize.leastsq(f,[1.0,1.0], # initial guess at starting point
args = (u,v,z_data) # alternatively you can do this with closure variables in f if you like
)
# result is the best fit point
对于您的特定函数,您可能可以做得更好 - 例如,对于 p
的任何给定值,C
的一个最佳值可以通过简单的线性代数确定.
你可以把问题转化成一个简单的线性最小二乘问题,然后你就完全不需要leastsq()
了。
z[i] == C * u[i] * v[i]**p
变成
z[i]/u[i] == C * v[i]**p
然后
log(z[i]/u[i]) == log(C) + p * log(v[i])
改变变量,你可以解决一个简单的线性问题:
Z[i] == L + p * V[i]
使用 numpy
并假设您有数组 z
、u
和 v
中的数据,这将呈现为:
Z = log(z/u)
V = log(v)
p, L = np.polyfit(V, Z, 1)
C = exp(L)
您可能应该在其周围加上 try:
和 except:
,以防某些 u
值为零或存在负值。