Matplotlib 获取使用 curve_fit 的 r-平方值
在数据分析中,我们经常需要使用线性或者非线性回归拟合来确定两个变量之间的关系。通常,我们可以使用 numpy
和 scipy
等数值计算库中提供的函数来实现回归拟合。但当我们拟合的数据点的分布比较离散或者存在周期性变化时,使用回归函数进行拟合的效果就会变得不稳定。这时候我们可以使用 curve_fit
实现更加准确的拟合。
curve_fit
是 scipy
库当中的一个函数,它可以利用非线性最小二乘拟合来找到两个变量之间的关系。相比于 numpy.polyfit
等传统拟合函数,curve_fit
可以拟合任意数学表达式的函数模型,并且允许我们使用最小二乘法来计算相关参数。
阅读更多:Matplotlib 教程
使用 curve_fit 进行回归拟合
下面我们来展示一个简单的使用 curve_fit
实现回归拟合的例子。
我们有一组模拟数据,包含 20 个样本点。这组数据呈现出一种类似于指数函数的形状。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
xdata = np.linspace(0, 4, 50)
ydata = 0.2 * np.exp(2 * xdata) + 0.1 * np.random.normal(size=len(xdata))
plt.scatter(xdata, ydata)
plt.show()
使用 curve_fit
进行非线性回归拟合的方式与使用其他拟合函数一样。我们需要定义一个函数模型,然后将要拟合的数据作为参数传递给 curve_fit
函数。这个函数定义了一个名称为 func
的指数函数,它包含两个未知参数 a
和 b
。将这个函数与需要拟合的数据一起传递给 curve_fit
函数,便可以获得最佳的拟合曲线。
def func(x, a, b):
return a * np.exp(b * x)
popt, pcov = curve_fit(func, xdata, ydata)
print(popt)
# [ 0.22334302 1.96879944]
运行上面的代码,我们可以得到输出结果:
[0.22334302 1.96879944]
其中 popt
数组包含了拟合函数的两个参数 a 和 b。为了验证拟合曲线的效果,我们继续绘制出拟合曲线:
plt.scatter(xdata, ydata, label='data')
plt.plot(xdata, func(xdata, *popt), 'r-', label='fit')
plt.legend(loc='upper left')
plt.show()
运行完这些代码后,我们得到了以下的输出,其中红线表示拟合曲线:
我们可以看到,拟合线与数据点非常接近。但这并不表示它是最好的拟合方式。接下来我们将介绍如何使用 R 平方值来评估拟合曲线的质量。
使用 R 平方值评估拟合曲线
R 平方值指的是“决定系数”(coefficient of determination)。它是一个介于 0 和 1 之间的值,用来描述回归函数对观测值的拟合程度。当 R 平方接近 1 时,即表示回归函数可以很好地解释观测值的变异性;而 R 平方接近 0 时,表示回归函数不能很好地拟合观测值。
使用 curve_fit
函数进行拟合后,我们可以通过计算 R 平方值来评估拟合曲线的质量。scipy
库已经提供了一个函数来计算 R 平方值,我们只需要将其导入并传入拟合数据和拟合函数的参数即可计算出 R 平方值。
from sklearn.metrics import r2_score
r2 = r2_score(ydata, func(xdata, *popt))
print(r2)
# 0.9430930868237493
运行上面的代码,我们可以得到输出结果:
0.9430930868237493
这意味着我们的拟合曲线可以解释数据 94% 的变异性。R 平方值越接近 1 表示线性回归模型越完美地拟合数据。下面是不同 R 平方值对应的拟合效果:
- R 平方 = 1,最好的拟合效果(红线完全重叠于数据点)。
-
0.9 <= R 平方 < 1,较好的拟合效果。
-
0.7 <= R 平方 < 0.9,一般的拟合效果。
-
0.5 <= R 平方 < 0.7,比较差的拟合效果。
-
R 平方 < 0.5,非常差的拟合效果。
总结
在本文中,我们学习了如何使用 curve_fit
函数来实现非线性回归拟合。我们还介绍了如何使用 R 平方值来评估拟合曲线的质量。这些知识对于数据分析和机器学习非常重要,帮助我们更好地理解数据之间的关系并提高预测模型的准确性。