与python进行二维拟合

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

我需要拟合一个函数

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

也就是说,我有一个二维数据集,我要找到两个参数,C和p。 numpy 或 scipy 中是否有可以直接完成此操作的东西? 我查看了 scipy.optimize.leastsq,但我不清楚如何在这里使用它。

python numpy scipy curve-fitting
3个回答
6
投票
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
的一个最佳值。


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
并假设您的数据位于数组
z
u
v
中,则呈现为:

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

您可能应该在其周围放置

try:
except:
,以防某些
u
值为零或存在负值。


0
投票

关于迟到的风险,我想详细说明其他答案。扁平化确实有效,但是从这个答案来看,还不清楚为什么,老实说,这更多的是一个错误而不是一个功能。

fitting_toolkit

提供了

一个函数
,可以在scipy.optimize的基础上以简单的方式执行此操作。这里的优点是
fitting_toolkit.multivariate_fit()
根本不关心如何格式化数据,因为它只在参数空间内工作。

全面披露,我是该软件包的主要贡献者。我实现这个是因为我需要它。

首先定义你的模型:

def z(uv, C, p): return C * uv[0] * uv[1]**p

其中 uv 是包含 u 和 v 数据的 numpy 数组的元组。具体如何打包取决于您,库不会接触您的数据。只需确保您的模型返回 1 维或 0 维数组进行求和即可。
然后您可以拟合您的模型:

from fitting_toolkit import multivariate_fit as fit uv = (u, v) sigma = np.ones_like(z_data) # mock error for equal weights popt, pcov = fit(z, uv, z_data, sigma=sigma, theta_0=theta_0)

DIY简单说明

拟合模型意味着最小化损失函数。您可以使用

scipy.optimize.minimize

(

Docs
) 自行完成。 from scipy.optimize import minimize # Loss function for unweighted least squares def loss_function(parameters): return np.sum((output - model(input, *parameters))**2) result = minimize(loss_function, theta_0, **kwargs) popt = result.x pcov = result.hess_inv

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.