python最小二乘法拟合,python 非线性最小二乘法
前言写完第一章,这一次,将实现骑在python上最有分量的一笔。
另一方面,为了以最有序的方式拟合随机数据,我们必须首先随机选择一些数据。这里是通过python的随机数函数实现的。
importnumpyasnpimportpandasasportstatmodels。Apassmimportmatplotlib。pyploasportseabornassnsp . random . seed(sed 35)将-5到5的随机数标记为X,返回e=2*NP.random.#randn) 35) randn满足标准正态分布的共35个随机值。放两个这样的随机值
其中红点是正确值(水平轴坐标值的2倍),蓝点是有误差的值)。这些错误刚刚生成。
去掉红点,做成y=2 * x的红线,尽量用最漂亮的笔拟合。
importnumpyasnpimportpandasaspdimportstatsmodels . apiassmimportmatplotlib . pyplotaspltimportsabornassnsnp . random . seed(sed 35)e=2 * NP . random . randn)35)y=2 * x # PLT . plot(x)x,y, ro ) PLT .)。
蓝线基于y=2x加上正态分布的误差。一般是用最整洁的笔相乘来拟合。红色是y=2x,说明他们很接近。
在学习的过程中,python可以自己编写代码,用随机数据进行实验,可以加深对知识的理解。
2.加权最佳笔乘法。一般认为最佳笔乘的所有数据都是相等的,但实际情况往往不是这样。例如,不同机器的测量精度不同,或者接近当前时间的测量值往往更准确。针对数据的不等性,采用“最完全加权笔乘”提高拟合精度。也就是说,越重要的数据被赋予越高的权重。
接下来,对(1)中的数据进行一些改变,以扩大第25至35个样本的误差。代码如下。
importnumpyasnpimportpandasaspdimportstatsmodels . apiassmimportmatplotlib . pyplotaspltimportsabornassnsnp . random . seed(sed 35)e=2 * NP . random . randn)35)y=2 * x # PLT . plot(x)x,y, ro ) PLT .)。
我们发现有些点偏离了上图中的红线。值得注意的是,样本的最后10个点,却没有集中在右侧。这是因为x取随机值,所以不一定按照从小到大的顺序排列。
此时,稍微修改一下代码,随机生成x,然后执行语句x.sort()。其他语句保持不变,如下图所示。
可以看出,图的右侧误差明显增大。此时,一般调用最整洁的笔画相乘拟合语句,会有以下效果。
发现拟合曲线与精确值(红线)偏差较大。
然后,使用最加权的笔乘法来拟合数据。方法如下。方法引用自其他博客。
用最简洁的笔乘法求最佳回归系数。
这里,W是权重矩阵(对角排列):
求解:(详细过程类似线性回归求解过程)))。
这三张官方图片是CSDN博客“_zZhe”的原创,其中这三张图片为转载,并链接了原图。
3359 _冯12489/文章/详情/80213739
接下来,根据上面的算法求解代码:
importnumpyasnpimportpandas aspdimportstatsmodels . apiassmimportmatplotlib . pyplotaspltimportsabornassnsp . random . seed(sed
, r-)y=2 * x for I in range(25,35): y [i]=3 * e [i] PLT.plot (x,y, bo) ans=[[0],[0]] #用于存储结果lenx=len(新矩阵记为x2X2X2=NP。数组(X)。shape (Lenx,1) #首先将X转换成单行矩阵。与前一个不同的是,X的元素是变量,X2的元素是一维数组。比如:#最初:x=[x1,x2,x3]#现在:X2=[[X1],[?)add=np.zeros((lenx,1)) # Teacher变成一个lenx子数组且子数组元素为0的二维数组,例如:# [[0],[0]] for I in range (lenx): #由于上述要求是1的列表,因此,将0改为1 add[I][0]=1 # print(add)x3=NP . h stack((add,x2)) # splice add和x2 with NP。比如h stack:#[[1,x1],[1,x2],[1,x3] matx=NP。当然像x3这样的数组数组也可以进行矩阵运算(借助点函数),但是比较麻烦。乘法符号可以直接以mat的形式使用。)Maty=np.mat (y2) ans=[[0],[0]] ans=np.mat (ans) #用于存储答案的矩阵t=2 #加权参数,Tw=np.mat (np.eye ((lenx)) #对应上图二中公式中的分母2t^2生成一个对角矩阵(此处为单位矩阵)作为w(即权重矩阵)#for i in range(lenx): #处理权重矩阵对角线上的数据avey=y.mean () Min=20kk=0f或i in range(lenx):如果ABS(y[I]-avey)Minn:Minn=ABS(y[I]-avey)kk=itest _ point=kk #这里选择y值最接近y平均值的样本对应的x值。 #print(?)# print(kk)for I in range(lenx):buf=x3[test _ point]-matx[I,] #这里的中间变量buf是lenx行两列的矩阵。每行的第一个元素存储测试点的x值,第二个元素存储差值w[i,I]=np.exp(buf*buf。T/-2*t**2) #权重矩阵的计算,也就是上面第二张图中的公式。这里有个窍门,就是平方运算#print(buf) #print(?)#print(buf*buf。T) #测试数据ans=(matx。t * (w * matx))。我* (matx。t * (w * maty)) #也就是上面第三张图中公式的计算# print()# print(ans)# print(maty)计算ans后转换成列表ANSx=[x [0],x[lenx-1]]ansy=[]ansy . append(ans[0][0]ans[1][0]* ANSx[0])ansy . append(ans[0][0])
与以前安装的比较
作者鲍文
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。