最小二乘法合函数的公式
使用最小二乘法拟合函数需要前置条件
- 设定多项式的阶数 $n$
- 存在大于多项式阶数的点坐标 $((x_1,y_1), (x_2,y_2), ..., (x_k,y_k))$
最小二乘拟合公式
$$ \begin{bmatrix} (\varphi_0,\varphi_0) & (\varphi_0,\varphi_1) & ... & (\varphi_0,\varphi_n)\\ (\varphi_1,\varphi_0) & (\varphi_1,\varphi_1) & ... & (\varphi_1,\varphi_n)\\ & &... \\ (\varphi_n,\varphi_0) & (\varphi_n,\varphi_1) & ... & (\varphi_n,\varphi_n)\end{bmatrix}\begin{bmatrix}a_0 \\ a_1 \\ ... \\ a_n\end{bmatrix}=\begin{bmatrix}(f,\varphi_0) \\(f,\varphi_1) \\ ... \\(f,\varphi_n) \end{bmatrix} $$-
其中括号的含义是矩阵内元素逐个相乘之和;
$\varphi_n$ 是所有点坐标的 $x$ 坐标的 $n$ 次方;
$a_n$ 是多项式每一阶前的参数, 从 0 开始增大;
$f$ 表示所有点坐标的 $y$ 坐标;
-
最终可以获得 $n$ 个包含 $a_n$ 的公式, 计算公式即可算出 $a_0,a_1,...,a_n$ 参数, 从而拟合多项式.
时序多维点坐标预测
对于预测时序多维点坐标, 可以将时间 $t$ 作为横坐标, 每个维度作为纵坐标, 分开拟合每个维度的多项式. 预测出每个维度的坐标值后再合并成一个点.
def np_ployfit(point_np, degree=1):
"""numpy polyfit使用连续3帧3维点的坐标预测下一帧3维点的坐标, 拟合使用的多项式为2阶
Args:
point_np (numpy): 点坐标矩阵 numpy([[frame1_point1],[frame1_point2],...],
[[frame2_point1],...],
[[frame3_point1],...])
degree (int): 自由度, 默认为2, 表示拟合2次函数
Returns:
numpy: _description_
"""
predictions = []
for i in range(point_np.shape[1]): # 对每一个点进行拟合
params = np.polyfit(np.arange(3), point_np[:, i, 0], degree) # 对 x 坐标进行拟合
x_pred = np.polyval(params, 3)
params = np.polyfit(np.arange(3), point_np[:, i, 1], degree) # 对 y 坐标进行拟合
y_pred = np.polyval(params, 3)
params = np.polyfit(np.arange(3), point_np[:, i, 2], degree) # 对 z 坐标进行拟合
z_pred = np.polyval(params, 3)
predictions.append([x_pred, y_pred, z_pred])
return np.array(predictions)