最小二乘法合函数的公式

使用最小二乘法拟合函数需要前置条件

  • 设定多项式的阶数 $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)

参考

【数值分析】【纯干货】速成最小二乘拟合法_哔哩哔哩_bilibili