使用np.polyfit在3维中拟合多项式

use*_*919 6 python numpy polynomials

我有一个数据数组,其中某个整数N的维度为(N,3),它指定了3D空间中粒子的轨迹,即每个行条目是粒子的(x,y,z)坐标.这个轨迹是平滑且简单的,我希望能够将多项式拟合到这个数据.

我可以使用np.polyfit只用(x,y)坐标来做到这一点:

import numpy as np

#Load the data
some_file = 'import_file.txt'

data = np.loadtxt(some_file)
x = data[:,0]
y = data[:,1]

#Fit a 4th order polynomial
fit = np.polyfit(x,y,4)
Run Code Online (Sandbox Code Playgroud)

这给了我多项式的系数,没有问题.

我如何将其扩展到我需要描述x,y,z坐标的多项式的情况?

Mir*_*ber 8

您可以使用 sklearn 使用PolynomialFeatures来完成此操作。

例如,考虑以下代码:

from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
X = np.random.rand(100,2)
y=X[:,0]**2-3*X[:,1]**3+2*X[:,0]*X[:,1]-5

poly = PolynomialFeatures(degree=3)
X_t = poly.fit_transform(X)

clf = LinearRegression()
clf.fit(X_t, y)
print(clf.coef_)
print(clf.intercept_)
Run Code Online (Sandbox Code Playgroud)

它打印

[  0.00000000e+00   1.08482012e-15   9.65543103e-16   1.00000000e+00
   2.00000000e+00  -1.18336405e-15   2.06115185e-15   1.82058329e-15
   2.33420247e-15  -3.00000000e+00]
-5.0
Run Code Online (Sandbox Code Playgroud)

这正是系数。

  • 很好的答案米里亚姆。不想在 stackOverflow 上创建太多线程,您(某人)知道如何提取拟合优度,例如 r^square 或 sum_of_square_errors 吗?我的意思是,在推导多项式之后,到原始数据集 (2认同)

kaz*_*ase 7

您在这里有多种选择。首先,让我们扩展您的 2D 案例fit = np.polyfit(x,y,4)。这意味着您将粒子的y位置描述为x的函数。只要它不会移回x 就可以了。(即每个x只能有一个唯一的y值)。由于空间中的运动被分解为三个独立的坐标,我们可以独立地拟合坐标以获得3D模型:

fitxy = np.polyfit(x, y, 4)
fitxz = np.polyfit(x, z, 4)
Run Code Online (Sandbox Code Playgroud)

现在yz都是x的多项式函数。如前所述,这有一个缺点,即粒子只能在x 中单调移动。

在此处输入图片说明

真正的物理粒子不会那样表现。它们通常会在所有三个维度上弹跳,随心所欲。然而,有一个第四维度,它们只能向前移动:时间

所以让我们添加时间:

t = np.arange(data.shape[0])  # simple assumption that data was sampled in regular steps

fitx = np.polyfit(t, x, 4)
fity = np.polyfit(t, y, 4)
fitz = np.polyfit(t, z, 4)
Run Code Online (Sandbox Code Playgroud)

现在,粒子被建模为在空间中自由移动,作为时间的函数。