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

时间:2017-07-27 12:30:47

标签: python numpy polynomials

我有一个数据数组,其维度为(N,3),用于某个整数 N ,它指定了3D空间中粒子的轨迹,即每行entry是粒子的(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)

这给出了多项式的系数,没有问题。

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

2 个答案:

答案 0 :(得分:4)

这里有几个选项。首先,让我们展开您的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)

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

enter image description here

真正的物理粒子不会表现得那样。它们通常会在所有三个维度上反弹,从而随心所欲。但是,有一个第四维度,他们永远不会转身:时间

所以让我们加点时间:

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)

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

答案 1 :(得分:1)

您可以使用PolynomialFeatures来使用sklearn进行此操作。

例如,请考虑以下代码:

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_)

打印

[  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

正是系数。