Numpy/SciPy 中包含所有误差的线性拟合
在本文中,我们将介绍如何使用 Numpy/SciPy 中的函数来进行包含所有误差的线性拟合,以及如何分析拟合结果并进行可视化。
阅读更多:Numpy 教程
数据准备
先准备一组数据,可以使用 numpy 的 random 函数来生成:
import numpy as np
x = np.linspace(0, 10, 50)
y = 3 * x + 2 + np.random.randn(len(x)) * 0.5
其中 linspace 函数生成了在 0 到 10 之间(包括 0 和 10)的 50 个等距的数值,randn 函数则生成了 50 个服从正态分布的随机数,乘上一个小的数值作为标准差后加到了 3x+2 的值上。
将这组数据可视化:
import matplotlib.pyplot as plt
plt.scatter(x, y)
plt.show()
可以看到,数据呈现出大致的线性关系。
线性拟合
使用 polyfit 函数进行线性拟合:
coefficients = np.polyfit(x, y, deg=1, cov=True)
a = coefficients[0][0]
a_err = np.sqrt(coefficients[1][0][0])
b = coefficients[0][1]
b_err = np.sqrt(coefficients[1][1][1])
其中 deg 参数指定拟合的多项式次数,这里是 1,表示进行线性拟合。
polyfit 函数返回一个二元组,第一个元素是多项式的系数,第二个元素是协方差矩阵。
计算得到拟合直线的斜率 a 和截距 b,同时计算误差,这里采用协方差矩阵的对角线元素来计算误差:
\Delta a = \sqrt{cov[0,0]}
\Delta b = \sqrt{cov[1,1]}
这里使用了 numpy 的 sqrt 函数来计算平方根。
结果分析
根据上面得到的斜率和截距,可以绘制出拟合的直线:
plt.scatter(x, y)
plt.plot(x, a * x + b, color='red')
plt.show()
可以看到,直线对数据的拟合效果还是很不错的,但是为了更加直观地进行分析,需要绘制出残差图。
残差就是每个数据点在拟合直线上的垂直距离,其大小表示了拟合误差的大小,可以使用下面的代码计算并绘制残差图:
residuals = y - (a * x + b)
plt.scatter(x, residuals)
plt.axhline(y=0, color='red', ls='--')
plt.show()
可以看到,残差图中的点应该在 0 线上下波动,并且没有明显的规律。如果残差图中出现某些模式,说明拟合结果不准确,需要进行重新拟合或进一步分析。
对拟合结果的另外一个重要的指标是 R^2 值,它可以表示拟合的好坏程度,这里可以使用 r2_score 函数来计算:
from sklearn.metrics import r2_score
r2 = r2_score(y, a * x + b)
该函数接受两组数据作为输入,分别是真实数据和拟合数据,返回 R^2 值,该值越接近 1,表示拟合效果越好。
总结
本文介绍了使用 Numpy/SciPy 中的函数进行包含所有误差的线性拟合的方法,同时给出了拟合结果分析的示例,包括拟合直线和残差图的绘制,以及 R^2 值的计算。在实际应用中,还需要根据数据的特点选择不同的拟合算法以及对拟合结果进行更加详细的分析,以得到更准确有效的拟合结果。
极客教程