用Python的numpy库进行线性拟合或者多项式拟合
在前文中,笔者使用最小二乘法矩阵计算进行数据的线性拟合
其实有更简单的方法:
- 用Python的numpy中的polyfit函数直接进行线性拟合
- 或者用numpy中的polyfit和poly1d进行多项式拟合
用Python的numpy中的polyfit函数直接进行线性拟合
程序代码:
import matplotlib.pyplot as plt
import numpy as np
#绘制原始数据的散点图
x = np.array([3.6, 3.7 ,3.8 ,3.9 ,4.0, 4.1, 4.2])
y = np.array([1.0, 0.9, 0.9, 0.81, 0.60, 0.56, 0.35])
plt.scatter(x,y)
#直接拟合
# y = slope * x + intercept
slope,intercept = np.polyfit(x,y,1)
#
print("线性方程的系数:")
print(slope)
print(intercept)
# 创建数据点
#x = np.linspace(-1, 10, 1100) # 从-1到10之间生成1100个点
x = np.linspace(3.5, 4.5, 100)
#y = f(x) # 对每个点计算y值
# 绘制拟合出来的一元一次线性方程的图像
plt.plot(x, slope * x + intercept, color = "blue")
plt.xlabel('x')
plt.ylabel('y')
plt.title('Display func: f(x) = ax+b ')
plt.grid() # 显示网格
plt.show() # 显示图像
运行结果:
用numpy中的polyfit和poly1d进行多项式拟合
程序代码:
import matplotlib.pyplot as plt
import numpy as np
#绘制原始数据的散点图
x = np.array([3.6, 3.7 ,3.8 ,3.9 ,4.0, 4.1, 4.2])
y = np.array([1.0, 0.9, 0.9, 0.81, 0.60, 0.56, 0.35])
plt.scatter(x,y)
#直接拟合
# 3次方程 的 多项式回归系数
coefs = np.polyfit(x,y,3)
# 多项式函数
poly = np.poly1d(coefs)
#
print("多项式 coefs:")
print(coefs)
# [-0.27777778 2.07142857 -4.50912698 3.3352381 ]
# 创建数据点
#x = np.linspace(-1, 10, 1100) # 从-1到10之间生成1100个点
# new_x
x = np.linspace(3.5, 4.5, 1000)
#y = f(x) # 对每个点计算y值
# 绘制拟合出来的一元一次线性方程的图像
plt.plot(x, poly(x), color = "blue")
plt.xlabel('x')
plt.ylabel('y')
plt.title('Display func: f(x) = ax^3 + bx^2 + cx + d')
plt.grid() # 显示网格
plt.show() # 显示图像
运行结果: