NumPy 中多维度多项式拟合(PolyFit)与多项式计算(PolyVal)

NumPy 中多维度多项式拟合(PolyFit)与多项式计算(PolyVal)

在本文中,我们将介绍 NumPy 中的多维度多项式拟合与多项式计算的用法。

阅读更多:Numpy 教程

多维度多项式拟合(PolyFit)

NumPy 中,可以使用 polyfit() 函数进行任意次数的多项式拟合,它可以应用于一维和多维数组。简单的来说,polyfit() 函数是通过拟合多项式来逼近一组数据。下面是 polyfit() 函数的语法:

numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)

参数说明:

  • x: 一维或多维数组,用于拟合的自变量。
  • y: 一维数组,用于拟合的因变量。
  • deg: 整数,表示拟合的多项式的次数。
  • rcond: float 类型,表示奇异值的截断阈值。默认值为 len(x) * eps,其中 eps 为机器可表示的最小数字。
  • full: bool 类型,表示是否返回完整输出数组。如果为 True,则返回拟合系数、残差以及秩等信息。默认为 False。
  • w: 一维数组,表示每个样本的权重。默认为 None。
  • cov: bool 类型,表示是否返回每个系数的协方差估计。默认为 False。

下面给出一个示例,演示如何使用 polyfit() 对二维数据进行 2 次多项式拟合:

import numpy as np
import matplotlib.pyplot as plt

# 构建一些随机数据进行拟合
x = np.linspace(-3, 3, 50)
y = np.linspace(-3, 3, 50)

X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))

# 添加一些噪声
Z_noise = 0.05 * np.random.normal(size=Z.shape)
Z += Z_noise

# 生成 2 次多项式系数
poly_coeffs = np.polyfit(x, y, 2)

# 用对应的多项式计算 y 的值
y_poly = np.polyval(poly_coeffs, x)

plt.figure()
plt.plot(x, y)
plt.plot(x, y_poly)
plt.show()

这段代码生成了一些有噪声的二维数据,并对其进行了 2 次多项式拟合,得到了拟合系数。接着,代码将使用 polyval() 函数用拟合系数计算出新的 y 值,并将拟合曲线与原始数据一起绘制在图表中。

多项式计算(PolyVal)

polyval() 函数可以应用于一维和多维数组,并且通过给定的多项式系数,计算拟合值。下面是 polyval() 函数的语法:

numpy.polyval(p, x)

参数说明:

  • p: 一维数组,用于包含多项式的系数。
  • x: 一维或多维数组,表示要对其进行插值的数值。

下面给出一个使用 polyfit()polyval() 的更高级示例。在这个示例中,我们将使用 polyfit() 拟合三维数据中的噪声,然后使用计算出的多项式系数来插值新的数据点。最后,我们将在立体图中绘制出原始数据和插值点之间的平滑 Surface。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

# 构建我们的数据
x = np.linspace(0, 1, 10)
y = np.linspace(0, 1, 10)
z = np.random.rand(10, 10)

# 将数据为 NaN 的位置转为 0
z_nan = np.nan_to_num(z)

# 用多项式进行拟合
poly_coeffs = np.polyfit(x, y, 5)
new_x = np.linspace(0, 1, 100)
new_y = np.linspace(0, 1, 100)

# 计算拟合值
new_z = []
for i in range(len(new_x)):
    new_row = []
    for j in range(len(new_y)):
        new_val = np.polyval(poly_coeffs, np.array([new_x[i], new_y[j]]))
        new_row.append(new_val)
    new_z.append(new_row)

new_z_arr = np.array(new_z)

# 绘制原始数据
x, y = np.meshgrid(x, y)
ax.plot_surface(x, y, z_nan, cmap='viridis')

# 绘制插值点
new_x, new_y = np.meshgrid(new_x, new_y)
ax.plot_surface(new_x, new_y, new_z_arr, cmap='viridis', alpha=0.6)

plt.show()

上面这个例子中,我们使用 polyfit() 对一个带有 NaN 值的 2D 数据集进行了多项式拟合。然后,我们使用 polyval() 计算拟合系数的新值,并绘制了原始和插值数据之间的立体图。

总结

在本文中,我们介绍了在 NumPy 中使用多项式拟合与多项式计算的方法,包括拟合多项式来逼近多组数据的 polyfit() 函数,以及使用拟合系数计算插值值的 polyval() 函数。NumPy 的多项式拟合与多项式计算提供了一种较为有用的方法,可以用来分析数据的各个属性之间的关系,或进行数据的降维处理。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程