11-11最小二乘法曲线拟合

最小二乘法多项式拟合(三次)

    • 求拟合的4种角度
    • 代码(三次拟合)
    • 一些常见的python基础

参考资料最小二乘拟合的三种算法推导及Python代码

求拟合的4种角度

  1. 从残差平方和最小的角度考虑(MSE),求模拟值和真实值差值平方和的函数,并且对参数求偏导
  2. 多项式拟合:几何角度上看,几个自变量就为几维空间,让数据所在空间和模拟与真实值之差互相垂直(内积为0)
  3. 一元线性拟合,求出β0和β1的表达式最小二乘拟合的三种算法推导及Python代码
  4. 从极大似然法角度,参数是确定的,构造似然函数,让似然函数值达到最大
  5. 从map(最大后验估计角度上看,参数本身也为随机变量)
    11-11最小二乘法曲线拟合_第1张图片11-11最小二乘法曲线拟合_第2张图片

代码(三次拟合)

import numpy as np
import matplotlib.pyplot as plt
#%% generate the dataset
x = np.array([0,5,10,15,20,25,35,40,45,50,55])
y = np.array([0,1.27,2.16,2.85,3.44,3.87,4.15,4.58,4.58,4.62,4.64])
print(x)
#%% calculate the normal equation
#定义矩阵A
x0 = np.zeros(11)+1
x1 = x
x2 = x*x
x3 = x*x*x
A = list(zip(x0,x1,x2,x3))
AT = np.transpose(A)
xx = np.dot(AT,A)
yy = np.dot(AT,y)
C = np.linalg.solve (xx,yy)
print(C)

# a = np.linalg.inv(A).dot(b)

#%% plot the picture
fig, ax = plt.subplots(1, 1, figsize=(6, 3))
ax.scatter(x, y, color='black',label="observed datas")
plt.xlabel("x")
plt.ylabel("y")
plt.grid()
#拟合值
y_sim = np.dot(A,C) 
ax.plot(x, y_sim,label="fitting curve")
#plt.text(30,3,str(round(C[0],4))+"+"+str(round(C[1],4))+'x+'+str(round(C[2],4))+"x^2+"+str(round(C[3],4))+"x^3")
plt.text(30,3,"y={0[0]:.4f}+{0[1]:.4f}x+{0[2]:.5f}x^2+{0[3]:.6f}x^3".format(C))
plt.legend()
plt.show()

一些常见的python基础

功能 代码
矩阵的转置 np.transpose(A) 或 A.T 或 B = [[A[j][i] for j in range(len(A))] for i in range(len(A[0]))]矩阵的转置
矩阵的行列式 np.linalg.det(A)
矩阵乘法(点乘) np.dot(A,B) 矩阵相乘
矩阵的逆 np.linalg.inv(A)
矩阵求解Ax=B np.linalg.solve(A,B)求解C
向量合并 [A,B,C…]或list(zip(A,B,C…))
字符串合并 "y={0[0]:.4f}+{0[1]:.4f}x+{0[2]:.5f}x^2” .format© 规定小数点精度 还有用list作为format中的输入Python format 格式化函数 或 用+连接
单位矩阵 np.eye(n)

你可能感兴趣的:(专业课,最小二乘法,算法)