python numpy/scipy曲线拟合

Bob*_*Bob 49 python numpy curve-fitting scipy

我有一些观点,我正在尝试适合这一点的曲线.我知道存在scipy.optimize.curve_fit函数,但我不懂文档,即如何使用这个函数.

我的观点: np.array([(1, 1), (2, 4), (3, 1), (9, 3)])

任何人都可以解释如何做到这一点?

jab*_*edo 86

我建议你从简单的多项式拟合开始,scipy.optimize.curve_fit尝试拟合f你必须知道的一组点的函数.

这是使用numpy.polyfit和的简单3次多项式拟合poly1d,第一次执行最小二乘多项式拟合,第二次计算新点:

import numpy as np
import matplotlib.pyplot as plt

points = np.array([(1, 1), (2, 4), (3, 1), (9, 3)])
# get x and y vectors
x = points[:,0]
y = points[:,1]

# calculate polynomial
z = np.polyfit(x, y, 3)
f = np.poly1d(z)

# calculate new x's and y's
x_new = np.linspace(x[0], x[-1], 50)
y_new = f(x_new)

plt.plot(x,y,'o', x_new, y_new)
plt.xlim([x[0]-1, x[-1] + 1 ])
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 问题是你的`x`数组没有排序,因此polyfit不工作,你必须正确地重新排序两个数组:`x = np.array([ - 1.,0.,.5,1.]) `和`y = np.array([.9,0.,.7,1.])` (6认同)
  • 对 x 值进行排序的替代方法:`x_new = np.linspace(min(x), max(x), 50)` (2认同)

Gre*_*reg 46

您首先需要将numpy数组分成两个包含x和y值的独立数组.

x = [1, 2, 3, 9]
y = [1, 4, 1, 3]
Run Code Online (Sandbox Code Playgroud)

curve_fit还需要一个提供您想要的拟合类型的函数.例如,线性拟合将使用类似的函数

def func(x, a, b):
    return a*x + b
Run Code Online (Sandbox Code Playgroud)

scipy.optimize.curve_fit(func, x, y)将返回包含两个阵列一个numpy的阵列:首先将包含值ab最适合你的数据,和第二个将是最佳拟合参数的协方差.

这是一个与您提供的数据线性拟合的示例.

import numpy as np
from scipy.optimize import curve_fit

x = np.array([1, 2, 3, 9])
y = np.array([1, 4, 1, 3])

def fit_func(x, a, b):
    return a*x + b

params = curve_fit(fit_func, x, y)

[a, b] = params[0]
Run Code Online (Sandbox Code Playgroud)

此代码将返回a = 0.135483870968b = 1.74193548387

这是一个带有你的点和线性拟合的情节......这显然是一个糟糕的情节,但你可以改变拟合函数来获得你想要的任何类型的拟合.

在此输入图像描述