我有一些观点,我正在尝试适合这一点的曲线。我知道存在scipy.optimize.curve_fit
函数,但我不懂文档,即如何使用这个函数。
我的观点:np.array([(1, 1), (2, 4), (3, 1), (9, 3)])
有人可以解释怎么做吗?
答案 0 :(得分:81)
我建议你从简单的多项式拟合开始,scipy.optimize.curve_fit
尝试拟合一个你必须知道的函数f
。
这是使用numpy.polyfit
和poly1d
的简单3次多项式拟合,第一个执行最小二乘多项式拟合,第二个计算新点:
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()
答案 1 :(得分:45)
首先需要将numpy数组分成两个包含x和y值的独立数组。
x = [1, 2, 3, 9]
y = [1, 4, 1, 3]
curve_fit还需要一个提供您想要的拟合类型的函数。例如,线性拟合将使用类似
的函数def func(x, a, b):
return a*x + b
scipy.optimize.curve_fit(func, x, y)
将返回包含两个数组的numpy数组:第一个数组将包含最适合您数据的a
和b
值,第二个数组将是最佳数据的协方差适合参数。
以下是与您提供的数据进行线性拟合的示例。
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]
此代码将返回a = 0.135483870968
和b = 1.74193548387
这是一个带有你的点和线性拟合的情节......这显然是一个糟糕的情节,但你可以改变拟合函数来获得你想要的任何类型的拟合。