最小二乘拟合(scipy实现)

Posted 我见众生皆草木,唯你是青山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小二乘拟合(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()  

 图形展示:

 

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

 

以上是关于最小二乘拟合(scipy实现)的主要内容,如果未能解决你的问题,请参考以下文章

数据拟合:最小二乘二维圆拟合的C++实现

最小二乘曲线拟合的C++实现

MATLAB点云处理(十八):直线拟合(最小二乘 | RANSAC)

Python SciPy库——拟合与插值

Python SciPy库——拟合与插值

Python SciPy库——拟合与插值