我有一个数据数组,其维度为(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 坐标的多项式的情况?
答案 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 中单调移动。
真正的物理粒子不会表现得那样。它们通常会在所有三个维度上反弹,从而随心所欲。但是,有一个第四维度,他们永远不会转身:时间。
所以让我们加点时间:
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
正是系数。