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坐标的多项式的情况?
您可以使用 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)
这正是系数。
您在这里有多种选择。首先,让我们扩展您的 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)
现在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)
Run Code Online (Sandbox Code Playgroud)
现在,粒子被建模为在空间中自由移动,作为时间的函数。