二维适合python

时间:2015-03-31 17:01:03

标签: python numpy scipy curve-fitting

我需要适合一个功能

z(u,v) = C u v^p

也就是说,我有一个二维数据集,我必须找到两个参数,C和p。是否有一些numpy或scipy可以直接的方式做到这一点?我看了一下scipy.optimize.leastsq,但是我不清楚我将如何在这里使用它。

2 个答案:

答案 0 :(得分:4)

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的最佳值。< / p>

答案 1 :(得分:1)

您可以将问题转换为简单的线性最小二乘问题,然后根本不需要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并假设您拥有数组zuv中的数据,这将呈现为:

Z = log(z/u)
V = log(v)
p, L = np.polyfit(V, Z, 1)
C = exp(L)

如果某些try:值为零或存在负值,您可能应该在其周围放置except:u