介绍
曲线拟合问题的提法是,已知一组(二维)数据,即平面上的n个点
互不相同,寻求一个函数(曲线)y = f(x) , 使f(x)在某种准则下与所有数据点最为接近,即曲线拟合得最好。
线性最小二乘法是解决曲线拟合最常用的方法,基本思路是,令
其中rk (x)是事先选定的一组线性无关的函数ak是待定系数(k = 1,2,…,m,m<n)。拟合准则是是yi,i = 1,2,…n,与f ( x i )的距离δ i 的平方和最小,称为最小二乘准则。
系数ak的确定
函数r k ( x ) 的选取
以上是书上摘抄的一些基本概念,主要是代码实现哈哈
理解和区别
拟合指的是已知某函数的若干离散函数值 {f1, fn 通过调整该函数中若干待定系数 f(λ1, λ2,…, λn 使得该函数与已知点集的差别 (最小二乘意义) 最小。
如果待定函数是线性,就叫线性拟合或者线性回归 主要在统计中否则叫作非线性拟合或者非线性回归。表达式也可以是分段函数,这种情况下叫作样条拟合。
从几何意义上讲,拟合是给定了空间中的一些点,找到一个已知形式未知参数的连续曲面来最大限度地逼近这些点;而插值是找到一个( 或几个分片光滑的 连续-曲面来穿过这些点。
选择参数 c 使得拟合模型与实际观测值在曲线拟合各点的残差 或离差 ek = yk - f( xk,c) 的加权平方和达到最小 此时所求曲线称作在加权最小二乘意义下对数据的拟合曲线 这种方法叫做 最小二乘法 。
样例
样 例 :对下列电学元件的电压电流记录结果进行最小二乘拟合,绘制相应曲线。
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import leastsq plt.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]) # 计算以 p 为参数的直线与原始数据之间误差 def f(p): k,b = p return (Y-(k*X+b)) #leastsq使得 f 的输出数组的平方和最小,参数初始值为[1, 0] r = leastsq(f, [1,0]) k, b = r[0] plt.scatter(X, Y, s=100, alpha=1.0, marker = 'o',label = u'数据点') x=np.linspace(0,10,1000) y=k*x+b ax = plt.gca() # ax.get_xlabel(...,fontsize =20) # ax.get_ylabel(...,fontsize =20) plt.plot(x,y,color = 'r',linewidth=5,linestyle=':',markersize=20,label=u'拟合曲线') plt.legend(loc=0,numpoints=1) leg = plt.gca().get_legend() ltext = leg.get_texts() plt.setp(ltext,fontsize ='xx-large') plt.xlabel(u'安培/') plt.ylabel(u'伏特/') 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()
每日一句
on’t aim for success if you want it; just do what you love and believe in, and it will come naturally.
如果你想要成功,不要去追求成功;尽管做你自己热爱的事情并且相信它,成功自然到来。