Python曲线拟合问题

参考了ailearning

导入基础包:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

多项式拟合

导入线多项式拟合工具:

from numpy import polyfit, poly1d

产生数据:

x = np.linspace(-3, 3, 100)
y = 4 * x + 1.5
noise_y = y + np.random.randn(y.shape[-1]) * 1.5

画出:

plt.xlabel("x")
plt.ylabel("y")
plt.title("y = 4x+3/2")

fitline1 = np.polyfit(x, noise_y, 1)
f = np.poly1d(fitline1)
p = plt.plot(x, f(x), label = "1fitline")
p = plt.scatter(x, noise_y,label = "noiseline")
p = plt.plot(x, y, label = "line")
plt.legend()
plt.figure()

进行线性拟合,polyfit 是多项式拟合函数,线性拟合即一阶多项式:

用 poly1d 生成一个以传入的 coeff 为参数的多项式函数:

多项式拟合正弦函数

正弦函数:

x = np.linspace(-np.pi,np.pi,100)
y = np.sin(x)

用一阶到九阶多项式拟合,类似泰勒展开:

y1 = poly1d(polyfit(x,y,1))
y3 = poly1d(polyfit(x,y,3))
y5 = poly1d(polyfit(x,y,5))
y7 = poly1d(polyfit(x,y,7))
y9 = poly1d(polyfit(x,y,9))

x = np.linspace(-3 * np.pi,3 * np.pi,100)
p = plt.plot(x, np.sin(x), 'k')
p = plt.plot(x, y1(x))
p = plt.plot(x, y3(x))
p = plt.plot(x, y5(x))
p = plt.plot(x, y7(x))
p = plt.plot(x, y9(x))
a = plt.axis([-3 * np.pi, 3 * np.pi, -1.25, 1.25])

可以看到,随着多项式拟合的阶数的增加,曲线与拟合数据的吻合程度在逐渐增大。

最小二乘拟合

导入相关的模块:

from scipy.linalg import lstsq
from scipy.stats import linregress

x = np.linspace(0,5,100)
y = 0.5 * x + np.random.randn(x.shape[-1]) * 0.35

plt.plot(x,y,'x')

Scipy.linalg.lstsq 最小二乘解

要得到 C ,可以使用 scipy.linalg.lstsq 求最小二乘解。

这里,我们使用 1 阶多项式即 N = 2,先将 x 扩展成 X

x = np.linspace(-3, 3, 50)
y = np.sin(x)
noise_y = y + np.random.randn(y.shape[-1]) * 0.5

X = np.hstack((x[:, np.newaxis], np.ones((x.shape[-1], 1))))
C, resid, rank, s = sp.linalg.lstsq(X, noise_y)
A, B, X, X, X = sp.stats.linregress(x, noise_y)

f1 = np.poly1d(np.polyfit(x, noise_y, 1));
p = plt.plot(x, f1(x), label = "fit")
p = plt.plot(x, A * x + B, label = "linregress")
p = plt.plot(x, C[0] * x + C[1], label = "lstsq")
p = plt.scatter(x, noise_y,label = "noise")
plt.legend()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值