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 的多项式拟合与多项式计算提供了一种较为有用的方法,可以用来分析数据的各个属性之间的关系,或进行数据的降维处理。