在本文中,我们将学习 Python 中给定数据集的不同方法的曲线拟合。但在开始之前,让我们先了解一下曲线拟合的目的是什么。
曲线拟合的目的是研究数据集并提取参数的优化值,以类似于给定函数的数据集。为此,我们将使用一个名为的函数curve_fit().
在开始使用我们的代码片段之前,让我们导入一些在开始之前需要导入的重要模块。
#importing modules import numpy as np import pandas as pd import matplotlib.pyplot as plt from scipy.optimize import curve_fit |
Python中的曲线拟合是什么?
给定数据集x = {x 1 , x 2 , x 3 …}和y= {y 1 , y 2 , y 3 …}和函数 f ,取决于未知参数z。我们需要为这个未知参数 z 找到一个最佳值,使得函数y = f(x, z)最类似于该函数和给定的数据集。此过程称为曲线拟合。
为此,我们还需要应用两种不同的方法进行曲线拟合。
- 最小二乘法
- 最大似然估计
最小二乘法
在此方法中,我们将通过调整z中的值来最小化函数Σ i (f(x i , z) – y i ) 2 。
我们可以找到最高最小化后的优化值。
最大似然估计
当数据集中出现错误时,我们可以使用此方法。即σ。
我们需要最小化函数Σ i (f(x i , z) – y i ) 2 / σ 2。它给出了上述函数的最高最小化后的z的最佳值。
让我们看一下我们的示例数据集,如下所示。
x_data = np.array([ 0.23547456 , 0.15789474 , 0.31578947 , 0.47368421 , 0.63157895 , 0.78947368 , 0.94736842 , 1.10526316 , 1.26315789 , 1.42105263 , 1.57894737 , 1.73684211 , 1.89473684 , 2.05263158 , 2.21052632 , 2.36842105 , 2.52631579 , 2.68421053 , 2.84210526 , 3.45454545 ]) y_data = np.array([ 2.95258285 , 2.49719803 , - 2.1984975 , - 4.88744346 , - 7.41326345 , - 8.44574157 , - 10.01878504 , - 13.83743553 , - 12.91548145 , - 15.41149046 , - 14.93516299 , - 13.42514157 , - 14.12110495 , - 17.6412464 , - 16.1275509 , - 16.11533771 , - 15.66076021 , - 13.48938865 , - 11.33918701 , - 11.70467566 ]) plt.scatter(x_data , y_data) plt.show() |
上面的代码片段将给出示例数据集的输出,如下所示。
曲线拟合示例1
为了描述未知参数 z,我们在模型中采用三个不同的变量,分别命名为 a、b 和 c。为了确定 z 的最佳值,我们需要分别确定 a、b 和 c 的值。即z= (a, b, c)。函数y = f (x, z) = f (x, a, b, c) = a(xb) 2 + c。让我们一步一步来。
步骤一:定义模型函数
def model_f(x,a,b,c): return a * (x - b) * * 2 + c |
第 2 步:使用 curve_fit() 函数
popt, pcov = curve_fit(model_f, x_data, y_data, p0 = [ 3 , 2 , - 16 ]) |
在上面的函数中,我们提供了a, b and c
as的初始值p0=[3,2,-16]
。
上面的函数将分别返回两个值popt、pcov。
popt array([ 4.34571181 , 2.16288856 , - 16.22482919 ]) pcov array([[ 0.19937578 , - 0.02405734 , - 0.1215353 ], [ - 0.02405734 , 0.00517302 , 0.00226607 ], [ - 0.1215353 , 0.00226607 , 0.29163784 ]]) |
- popt :a、b、c 的估计优化值
- pcov:协方差矩阵或误差
现在让我们为获得的 a、b 和 c 的优化值绘制相同的函数。在这种情况下,我们将仅解释我们的 popt 值(最小二乘法),在下一个代码片段中,我们将解释我们的 pcov 值(即解释错误值)。
a_opt, b_opt, c_opt = popt x_model = np.linspace( min (x_data), max (y_data), 100 ) y_model = model_f(x_model, a_opt, b_opt, c_opt) plt.scatter(x_data, y_data) plt.plot(x_model, y_model, color = 'r' ) plt.show() |
上面的代码片段将给出如下所示的输出。
现在解释 pcov 值,我们可以更好地拟合给定函数(最大似然估计)。让我们快速浏览一下下面的代码片段。
plt.imshow(np.log(np. abs (pcov))) plt.colorbar() plt.show() |
上面的代码片段将给出如下输出。
实施例2
让我们用另一个例子(对于不同的函数)来理解给定的数据集,并尝试两种不同的方法。在此示例中,为了描述未知参数z
,我们在模型中采用了四个不同的变量,名为 a、b、c 和 d。为了确定 z 的最佳值,我们需要分别确定 a、b、c 和 d 的值。让我们快速浏览一下下面的代码片段。
步骤一:定义模型函数
#Defining our function def fit_f(x,a,b,c,d): return a * (x - b) * * 2 + c + d * 0.0001 * np.cos(x) |
步骤 2:使用 curve_fit() 函数
#using our curve_fit() function popt, pcov = curve_fit(fit_f,x_data,y_data,p0 = [ 1 , 2 , - 16 , 1 ]) |
在上面的函数中,我们提供了a, b, c and d
as的初始值p0=[1,2,-16,1]
。
我们可以通过打印相同的内容来看到 popt 和 pcov 的值。
popt array([ 5.00494014e + 00 , 2.75689923e + 00 , - 2.21559741e + 01 , - 8.97724662e + 04 ]) pcov array([[ 1.71072218e - 01 , 4.21450805e - 03 , - 4.30580853e - 01 , - 5.74603933e + 03 ], [ 4.21450805e - 03 , 3.33701247e - 02 , - 3.97891468e - 01 , - 4.49561407e + 03 ], [ - 4.30580853e - 01 , - 3.97891468e - 01 , 5.68973874e + 00 , 6.50631130e + 04 ], [ - 5.74603933e + 03 , - 4.49561407e + 03 , 6.50631130e + 04 , 7.82484767e + 08 ]]) |
现在让我们为获得的 a、b 和 c 的优化值绘制相同的函数。在这种情况下,我们将仅解释我们的 popt 值(最小二乘法),在下一个代码片段中,我们将解释我们的 pcov 值(即解释错误值)。
a_opt, b_opt, c_opt, d_opt = popt x_model = np.linspace( min (x_data), max (y_data), 100 ) y_model = fit_f(x_model, a_opt, b_opt, c_opt,d_opt) plt.scatter(x_data, y_data) plt.plot(x_model, y_model, color = 'r' ) plt.show() |
上面的代码片段将给出如下输出。
现在解释 pcov(协方差误差矩阵)值,我们可以更好地拟合给定函数(最大似然估计)。让我们快速浏览一下下面的代码片段。
plt.imshow(np.log(np. abs (pcov))) plt.colorbar() plt.show() |
概括
今天,我们学习了Python曲线拟合。我们已经了解了如何使用curve_fit()
给定数据集的方法来优化给定函数。您可以采用除我们的示例之外的任何其他数据集,并尝试上面的代码片段。
您可以尝试获取不同数据集的 CSV 文件并提取相同数据集的优化值。
我希望您会发现这篇文章更有帮助。我们必须带着一些更令人兴奋的话题再次访问。