zoukankan      html  css  js  c++  java
  • 最小二乘拟合(scipy实现)

    Scipy库在numpy库基础上增加了众多数学,科学及工程计算中常用库函数。如线性代数,常微分方程数值求解,信号处理,图像处理,稀疏矩阵等。

    如下理解通过Scipy进行最小二乘法拟合运算

    最小二乘拟合(optimize子函数)

    from scipy.optimize import leastsq 

    optimize函数含有实现最小二乘法的函数 leastsq,

    如下通过对正弦函数的拟合,求得最小二乘拟合参数。func三参数A,k,theta分别表示对应振幅,频率,相角。

    import  numpy as np 
    from scipy.optimize import leastsq
    import pylab as pl 
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['KaiTi']  # 解决中文乱码
    mpl.rcParams['axes.unicode_minus'] = False 	 # 解决负号显示为方框的问题
    
    def func(x,p):
    
    	# 数据拟合所用函数: A*sin(2*pi*k*x + theta)
    
    	A,k,theta  = p
    	return A*np.sin(2*np.pi*k*x + theta)
    
    def residuals(p,y,x):
    
    	# 实验数据x,y和拟合函数之间的差,p为拟合需要找到的系数
    
    	return y - func(x,p)
    
    x = np.linspace(0, -2*np.pi, 100) # 创建等差数列,100表示数据点个数
    A,k,theta = 10, 0.34 , np.pi/6  # 真实数据的函数参数
    y0 = func(x, [A,k,theta])       # 真实数据
    y1 = y0 + 2* np.random.randn(len(x)) # 加入噪声后的实验数据
    
    p0  = [7,0.2,0] 				# 第一次猜测的函数拟合参数
    
    """
    	1、调用leastsq进行数据拟合
    	2、residuals为计算误差的函数
    	3、p0为拟合参数的初始值
    	4、args为需要拟合的实验数据
    """
    plsq = leastsq(residuals,p0,args = (y1,x))
    
    print(u"真实参数:", [A,k,theta])
    print(u"拟合参数:", plsq[0])    #实验数据拟合后的参数
    
    # 作图
    pl.plot(x, y0, label = u'真实数据')
    pl.plot(x, y1, label = u'带噪声的实验数据')
    pl.plot(x, func(x,plsq[0]) , label = u"拟合数据")
    pl.legend()
    pl.show()  

     图形展示:

     

    以上可以看出由于正弦函数的周期性,拟合参数规律走势和和真实数据实际上是一致的。

  • 相关阅读:
    photoshop
    Linux服务之 Nginx安装
    linux笔记之基础 1
    GPT分区
    ftp
    python socket
    mariaDB
    redids
    长连接和短连接
    linux文件打包并发送到其他服务器
  • 原文地址:https://www.cnblogs.com/hqczsh/p/11297669.html
Copyright © 2011-2022 走看看