<强> 1,最小二乘也可以拟合二次函数强>
我们都知道用最小二乘拟合线性函数没有问题,那么能不能拟合二次函数甚至更高次的函数呢?答案当然是可以的。下面我们就来试试用最小二乘来拟合抛物线形状的的图像。
对于二次函数来说,一般形状为f (x)=* * x + b * x + c,其中a, b, c为三个我们需要求解的参数。为了确定a, b, c,我们需要根据给定的样本,然后通过调整这些参数,知道最后找出一组参数a, b, c,使这些所有的样本点距离f (x)的距离平方和最小。用什么方法来调整这些参数呢?最常见的自然就是我们的梯度下降喽。
辣库中有名为leastsq的方法,只需要输入一系列样本点,给出待求函数的基本形状,就可以针对上述问题求解了。
<强> 2,抛物线拟合源码强>
# !/usr/bin/env python utf - 8编码: 进口numpy np 进口matplotlib。pyplot作为plt 从scipy。优化进口leastsq #待拟合的数据 X=np.array ([1, 2, 3, 4, 5, 6)) Y=np.array([9.1, 18.3, 32岁,47岁,69.5,94.8)) #二次函数的标准形式 def func (params, x): a, b, c=参数 返回一个* * x + b * x + c #误差函数,即拟合曲线所求的值与实际值的差 def错误(params, x, y): 返回函数参数x - y #对参数求解 def slovePara (): p0=(10、10、10) 帕拉=leastsq(错误、p0 args=(X, Y)) 返回帕拉 #输出最后的结果 def解决方案(): 帕拉=slovePara () a, b, c=Para [0] 打印“=?“b=b, c=" c 打印“成本:”+ str (Para [1]) 打印”求解的曲线是:“ 打印(" y=" + str(圆(a, 2)) + x * x + + str(圆(b, 2)) + x + + str (c)) 6) plt.figure (figsize=(8日) plt。散射(X, Y,颜色=奥躺北昵?笆纠荨?线宽=2) #画拟合直线 x=np.linspace(0, 12100) # #在0-15直接画100个连续点 y=x * * x + b * + c # #函数式 plt。情节(x, y,颜色=昂焐?标签=敖饩龇桨浮毕?线宽=2) plt.legend() #绘制图例 plt.show () 解决方案() >之前<强>上面的代码中,稍微注意的是如下几点:强>
1.函数是待拟合的曲线的形状。本例中为二次函数的标准形式。
2。误差为误差函数。很多同学会问不应该是最小平方和吗?为什么不是func (params, x) - y * func (params, x) - y ?原因是名为持续的方法中帮我们做了。看一下sklearn中源码的注释就知道什么情况了:
的平方和最小化的一组方程。 x=参数最小(总和(func (y) * * 2,轴=0)) y二次方的操作在源码中帮我们实现了。
3. p0里放的是a, b, c的初始值,这个值可以随意指定。往后随着迭代次数增加,a, b, c将会不断变化,使得错误函数的值越来越小。
4。leastsq的返回值是一个元组,它里面有两个元素,第一个元素是a, b, c的求解结果,第二个则为成本函数的大小!
3。程序的最终结果与拟合曲线
程序最终的输出结果:
c=2.06607141425 b=2.5975001036=4.68999985496 成本:1 求解的曲线是: * x + y=2.07 x 2.6 x + 4.68999985496最终的拟合曲线:
<强> 4模拟其他曲线强>
leastsq函数除了可以模拟线性函数二次函数等多项式,还适用于任何波形的模拟。
比如方波:
def square_wave (x, p): a、b、c、T=p y=np.where (np.mod(取向,T) & lt; T/2, 1 + c/a, 0) y=np.where (np.mod(取向,T)在T/2, 1 + c/a, y) 返回一个* y比如高斯分布:
def gaussian_wave (x, p): a, b, c, d=p 返回一个* np.exp(-(取向)* * 2/(2 * c * * 2)) + d只要将上面代码中的func换成对应的函数即可。
以上这篇在python中利用最小二乘拟合二次抛物线函数的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
在python中利用最小二乘拟合二次抛物线函数的方法