最小二乘法-多项式拟合曲线

  如果你有一批散点图,像以下,(图都是从百度找的)

  想要画出这些散点图的拟合曲线,也可以说是趋势曲线,我想,本文可教你,详情请耐心往下看。

方法一:np.polyfit

  np.polyfit也是利用最小二乘多项式来拟合曲线的:

  首先,先画出如上所示的散点图,大概看下散点分布趋势,究竟是像跟头发丝往上飘呢还是想落叶往下落呢?才能决定用哪种函数来拟合

  假使选定多项式方程来拟合的话,那么首先得先求出多项式的各项系数,np.polyfit可以帮助我们求得多项式的系数,np.poly1d又可以帮助我们将系数代入原假设的方程中

k = np.polyfit(x, y, i)
func = np.poly1d(k)#将系数代入方程,得到方程式func

  其中,i 为多项式的最高次数,假如i为3,那么多项式的基本方程为 y = k3*x^3 +k2*x^2+k1*x + b

  得到的func方程,如果想要获得某个值所对应的的y值,可直接套用 y =  func(x)

方法二:leastsq

  最小二乘法,即最小化的真实值和预测值的平方差之和。对于所有的散点,求出距离所有散点到曲线的距离平方和,使之最小化,即是拟合曲线

  

  假使你不想用多项式来拟合曲线,想用其他函数,比如sin,cos,etc。那么,Scipy中optimize模块的leastsq可以帮助我们用最小二乘法拟合曲线趋势

  定义一个函数方程,此处示例为三次方程,多项式的系数和常数项都放在Klist中

def func(klist,x):
    k1,k2,k3,b = klist
#k1,k2,k3,b = klist[0],klist[1],klist[2],klist[3]
return k1*x**3 + k2*x**2 + k3*x + b

  再定义一个偏差函数

##偏差函数:x,y都是列表:这里的x,y更上面的Xi,Yi中是一一对应的
def error(klist,x,y):
    return func(klist,x)-y

  由于leastsq已经将最小二乘法的”偏差平方”和”最小化”封装在函数中,所以偏差函数不用自行加“平方”

  klist 为系数的初始值,args是除了系数之外的其他参数

klist = [0.01,0.01,0.01,0.0]
plesq = leastsq(error,x0 = klist,args=(x,y))

  此时我们就可以得到用最小二乘法求得的拟合曲线系数啦

    

 

  在这里分享了两种最小二乘法拟合曲线的方法,以后还会继续完善python中最小二乘法的用法。看了请点个赞哦!

 

 

 

 

 

 

  

  

 

posted @ 2019-07-16 10:54  彩色条纹小斑马  阅读(1555)  评论(0编辑  收藏  举报