当前位置 : 主页 > 手机开发 > ROM >

最小二乘拟合(scipy实现)

来源:互联网 收集:自由互联 发布时间:2021-06-10
Scipy库在numpy库基础上增加了众多数学,科学及工程计算中常用库函数。如线性代数,常微分方程数值求解,信号处理,图像处理,稀疏矩阵等。 如下理解通过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()  

 图形展示:

 分享图片

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

上一篇:理解Promise (1)
下一篇:matplotlib常见操作
网友评论