You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

沿直线评估二维高斯分布的方法咨询(Python/Numpy/卡尔曼滤波)

二维高斯沿直线投影为一维高斯的计算方法

你的结论是对的:二维多元高斯分布沿任意直线投影后,得到的确实是一维高斯分布。下面是具体的数学推导和Python/Numpy实现,适配卡尔曼滤波场景。

核心数学推导

假设二维高斯分布的参数为:

  • 均值向量:$\boldsymbol{\mu} = \begin{bmatrix} \mu_x \ \mu_y \end{bmatrix}$(2×1向量)
  • 协方差矩阵:$\boldsymbol{\Sigma} = \begin{bmatrix} \sigma_{xx} & \sigma_{xy} \ \sigma_{yx} & \sigma_{yy} \end{bmatrix}$(2×2对称矩阵)

直线的表示

用两个参数定义目标直线:

  • 直线上任意参考点:$\boldsymbol{p} = \begin{bmatrix} p_x \ p_y \end{bmatrix}$(2×1向量)
  • 直线的单位方向向量:$\boldsymbol{u} = \begin{bmatrix} u_x \ u_y \end{bmatrix}$(满足$\boldsymbol{u}^T\boldsymbol{u} = 1$,即模长为1)

沿直线的一维坐标$s$定义为:直线上的任意点$\boldsymbol{x}$可表示为 $\boldsymbol{x} = \boldsymbol{p} + s\boldsymbol{u}$,其中$s$是该点相对于$\boldsymbol{p}$的一维坐标。

一维高斯的参数计算

对于服从二维高斯的随机变量$\boldsymbol{x} \sim \mathcal{N}(\boldsymbol{\mu}, \boldsymbol{\Sigma})$,对应的一维坐标$s$服从一维高斯$\mathcal{N}(s_0, \sigma_s^2)$,参数计算如下:

  1. 均值$s_0$:原高斯均值$\boldsymbol{\mu}$在直线上对应的坐标
    $$s_0 = \boldsymbol{u}^T (\boldsymbol{\mu} - \boldsymbol{p})$$
  2. 方差$\sigma_s^2$:原高斯在直线方向上的方差(协方差矩阵在$\boldsymbol{u}$方向的投影)
    $$\sigma_s^2 = \boldsymbol{u}^T \boldsymbol{\Sigma} \boldsymbol{u}$$

Python/Numpy 实现示例

import numpy as np
import matplotlib.pyplot as plt

# 1. 定义二维高斯参数(模拟卡尔曼滤波中的状态分布)
mu = np.array([[2.0], [3.0]])  # 均值向量(2x1)
Sigma = np.array([[1.0, 0.5], [0.5, 2.0]])  # 协方差矩阵(2x2)

# 2. 定义目标直线的参数
p = np.array([[0.0], [1.0]])  # 直线上的参考点
u = np.array([[1.0], [1.0]]) / np.sqrt(2)  # 单位方向向量(确保模长为1)

# 3. 计算一维高斯的参数
s0 = u.T @ (mu - p)  # 均值,结果为(1x1)数组
sigma_s_sq = u.T @ Sigma @ u  # 方差,结果为(1x1)数组
sigma_s = np.sqrt(sigma_s_sq)

print(f"一维高斯均值 s0: {s0[0,0]:.2f}")
print(f"一维高斯标准差 sigma_s: {sigma_s[0,0]:.2f}")

# 4. 可视化(可选,帮助理解)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

# 绘制二维高斯等高线
x, y = np.meshgrid(np.linspace(-1, 5, 100), np.linspace(-1, 6, 100))
pos = np.dstack((x, y))
inv_Sigma = np.linalg.inv(Sigma)
det_Sigma = np.linalg.det(Sigma)
pdf_2d = np.exp(-0.5 * np.einsum('...k,kl,...l->...', pos - mu.T, inv_Sigma, pos - mu.T)) / (2 * np.pi * np.sqrt(det_Sigma))
ax1.contour(x, y, pdf_2d, levels=5, cmap='Blues')
# 绘制直线
s_line = np.linspace(-3, 6, 100)
x_line = p[0] + s_line * u[0]
y_line = p[1] + s_line * u[1]
ax1.plot(x_line, y_line, 'r-', label='目标直线')
# 标记原高斯均值在直线上的投影点
proj_mu = p + s0 * u
ax1.scatter(mu[0], mu[1], c='k', marker='x', label='二维高斯均值')
ax1.scatter(proj_mu[0], proj_mu[1], c='r', marker='o', label='均值在直线上的投影')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.legend()
ax1.set_title('二维高斯与目标直线')

# 绘制投影后的一维高斯
s_vals = np.linspace(s0 - 3*sigma_s, s0 + 3*sigma_s, 100)
pdf_1d = np.exp(-0.5 * ((s_vals - s0)**2) / sigma_s_sq) / (np.sqrt(2 * np.pi * sigma_s_sq))
ax2.plot(s_vals, pdf_1d, 'b-')
ax2.axvline(s0, color='r', linestyle='--', label='一维高斯均值')
ax2.fill_between(s_vals, 0, pdf_1d, alpha=0.2, color='b')
ax2.set_xlabel('直线坐标 s')
ax2.set_ylabel('概率密度')
ax2.legend()
ax2.set_title('投影后的一维高斯分布')

plt.tight_layout()
plt.show()

卡尔曼滤波场景说明

在卡尔曼滤波中,这种投影操作常见于:

  • 将二维位置状态投影到运动轨迹直线上,简化状态估计
  • 传感器测量模型的线性投影(比如雷达测量目标在某方向上的距离)
  • 状态约束(强制状态落在某条直线上,比如道路约束)

内容的提问来源于stack exchange,提问作者Cornelius Einem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 10:35:15