
本文共 1978 字,大约阅读时间需要 6 分钟。
Python曲线拟合——最小二乘法入门
曲线拟合的概念
曲线拟合问题是已知一组二维数据点 $(x_i, y_i)$,$i=1,2,…,n$,寻求一个函数 $y = f(x)$,使得该函数在某种准则下与所有数据点的差异(最小二乘意义)最小。这种方法被称为最小二乘法,是解决曲线拟合问题最常用的方法。
线性最小二乘法的基本思路
线性最小二乘法的核心思想是通过最小化预测值与实际值之间误差的平方和,找到最佳拟合曲线。具体而言,假设拟合曲线可以表示为:
$$f(x) = a_1 r_1(x) + a_2 r_2(x) + ... + a_m r_m(x)$$
其中,$r_k(x)$ 是预先选定的线性无关的基函数,$a_k$ 是待定系数。拟合的目标是最小化误差函数:
$$\delta_i = y_i - f(x_i)$$
平方和:
$$\sum_{i=1}^{n} \delta_i^2$$
通过最小化上述平方和,可以得到最优拟合系数 $a_k$,从而确定最佳拟合曲线。
系数 $a_k$ 的确定方法
在实际应用中,系数 $a_k$ 的确定通常通过以下步骤完成:
通过这些步骤,可以得到最佳拟合曲线,使其与原始数据点的误差最小。
函数 $r_k(x)$ 的选取
函数 $r_k(x)$ 的选择直接影响拟合曲线的形状。常见的选择包括:
- 多项式函数:如 $r_0(x) = 1$,$r_1(x) = x$,$r_2(x) = x^2$ 等。
- 指数函数:如 $r(x) = e^{kx}$。
- 正弦函数:如 $r(x) = \sin(kx)$。
基函数的数量和类型需要根据实际问题进行选择,以确保拟合曲线能够准确捕捉数据的特征。
拟合与插值的区别
虽然拟合和插值都涉及寻找最佳拟合曲线,但两者存在显著差异:
- 拟合:寻求一个未知参数的连续曲线,使其尽可能接近给定点集。
- 插值:寻求一个光滑连续曲线,严格穿过给定点集。
两者的主要区别在于,拟合强调最小误差,而插值通常要求曲线在给定点上有特定性质(如光滑性)。
样例:电学元件电压电流记录的拟合
以下是一个实际的最小二乘拟合示例,使用 Python 的 numpy 和 matplotlib 库进行实现:
import numpy as npimport matplotlib.pyplot as pltfrom scipy.optimize import leastsqplt.figure(figsize=(9,9))X = np.array([8.19, 2.72, 6.39, 8.71, 4.7, 2.66, 3.78])Y = np.array([7.01, 2.78, 6.47, 6.71, 4.1, 4.23, 4.05])def f(p): k, b = p return Y - (k * X + b)r = leastsq(f, [1, 0])k, b = r[0]plt.scatter(X, Y, s=100, alpha=1.0, marker='o', label='数据点')x = np.linspace(0, 10, 1000)y = k * x + bax = plt.gca()plt.plot(x, y, color='r', linewidth=5, linestyle=':', markersize=20, label='拟合曲线')plt.legend(loc=0, numpoints=1)leg = plt.gca().get_legend()ltext = leg.get_texts()plt.setp(ltext, fontsize='xx-large')plt.xlabel('安培')plt.ylabel('伏特')plt.xlim(0, x.max() * 1.1)plt.ylim(0, y.max() * 1.1)plt.xticks(fontsize=20)plt.yticks(fontsize=20)plt.legend(loc='upper left')plt.show()
上述代码实现了一个简单的线性回归模型,拟合了电流与电压之间的关系。
总结
通过上述内容可以看出,最小二乘法在曲线拟合中的核心作用。选择合适的基函数和优化方法,是实现高精度拟合的关键。在实际应用中,需要根据具体问题灵活选择拟合模型,以达到最佳拟合效果。
发表评论
最新留言
关于作者
