代码语言:javascript复制
import numpy as np
import scipy as sp
#导入SciPy模块内置的最小二乘法函数
from scipy.optimize import leastsq
import pylab as plt
m=9#多项式的次数
#定义一个示例函数:y=sin(6x^4 8x^4) 12
def real_func(x):
return np.sin(6*x**4 8*x**4) 12
#定义多项式用于拟合曲线
def fit_func(p,x):
f=np.poly1d(p)
return f(x)
#定义偏差函数
def residuals(p,y,x):
return y-fit_func(p,x)
#随机选取10个样本数据点,作为x
x=np.linspace(0, 1, 15)
#定义曲线可视化所需的数据点个数
x_show=np.linspace(0,1,1000)
y0=real_func(x)
#加入正态分布噪声后的y
y1=[np.random.normal(0,0.1) y for y in y0]
#随机产生一组多项式分布的参数
p0=np.random.randn(m)
#利用内置的最小二乘法函数计算曲线拟合参数
plsq=leastsq(residuals,p0,args=(y1,x))
#输出拟合参数
print ('Fitting Parameters:',plsq[0])
#可视化拟合曲线、样本数据点以及原函数曲线
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.plot(x_show,real_func(x_show),color='b',linestyle='-',marker='',label='真实曲线')
plt.plot(x_show,fit_func(plsq[0],x_show),color='g',linestyle='--',marker='',label='拟合曲线')
plt.plot(x,y1,'yo',label='带噪声的样本数据点')
plt.legend()
plt.show()
Fitting Parameters: [ 1.26607557e 04 -4.98135295e 04 7.91163644e 04 -6.47495637e 04 2.88643748e 04 -6.80602407e 03 7.57452772e 02 -2.89393911e 01 1.19739704e 01]
算法:最小二乘法曲线拟合是通过最小化误差的平方和寻找数据的最佳函数匹配,应用在曲线拟合、线性回归预测,数理统计等领域。