avatar

目录
归一化

为什么 motion update不用normalize呢 而 meas update需要?

又是一个非常好的问题!

一句话回答:因为运动更新(Motion Update)本身就是一个保持概率总和为1的操作,所以它不需要归一化。

下面是详细的解释:

运动更新的本质
运动更新的本质是重新分配概率。想象一下,在移动之前,整个地图上所有格子的概率总和是1。移动这个动作,并没有创造新的概率,也没有让任何概率消失,它只是把每个格子的概率按照一定的规则(成功移动或失败移动)转移到其他格子上。

我们来分析一下你的代码(前向传播/加法思路),看看为什么概率总和不变:

移动前,我们假设 sum(p) == 1

q = [[0, …], …] # q的总和是0

for row in range(row_num_max):
for col in range(col_num_max):

我们把 p[row][col] 这个概率值分成两部分

    prob_to_move = p[row][col] * p_move
    prob_to_stay = p[row][col] * (1 - p_move)

    # 注意:prob_to_move + prob_to_stay = p[row][col] * (p_move + 1 - p_move) = p[row][col]
    # 这说明我们只是把 p[row][col] 的概率拆开了,总数没变

    # 然后我们把这两部分概率加到新的分布q中
    q[exp_row][exp_col] += prob_to_move
    q[row][col] += prob_to_stay

python

在整个循环中,我们对每一个 p[row][col] 都做了这样的拆分和重新分配。因为每次拆分都没有损失概率(prob_to_move + prob_to_stay = p[row][col]),所以当我们遍历完所有的格子后,q 的总和就等于原来 p 的总和。

既然移动前 sum(p) 是1,那么移动后 sum(q) 也必然是1。所以,不需要再进行归一化。

测量更新为什么需要归一化?
与运动更新不同,测量更新(Measurement Update)会改变概率的总和。

测量前,sum(p) == 1

for row in range(row_num_max):
for col in range(col_num_max):

我们用一个小于1的系数(sensor_right 或 1-sensor_right)去乘以原来的概率

    q[row][col] = p[row][col] * (hit * sensor_right + (1-hit) * (1-sensor_right))

python

因为 sensor_right 和 1-sensor_right 通常都小于1,所以 q[row][col] 会小于 p[row][col]。当我们把所有的 q 加起来时,它的总和 s 几乎肯定会小于1。

这个操作引入了新的信息,使得我们对某些位置更加“确定”,对另一些位置更加“不确定”,但这个过程本身不是一个封闭的概率转移。为了让 q 重新成为一个有效的概率分布(总和为1),我们必须将它的每一项都除以总和 s。这就是归一化的过程。

总结
运动更新 (Motion Update):是一个封闭系统的概率重新分配。总概率保持不变,因此不需要归一化。
测量更新 (Measurement Update):是一个开放系统,引入了外部信息。总概率会发生变化(通常是减小),因此必须进行归一化,使其重新成为有效的概率分布。

Task Completed
这是一个非常核心的问题!

简单来说:因为运动更新(Motion Update)本身就是一个保持概率总和为1的操作,所以它天然地不需要归一化。

下面是详细的解释:

运动更新的本质:概率的重新分配
运动更新的本质是重新分配地图上已经存在的总概率。在移动之前,我们假设地图上所有格子的概率总和是1。移动这个动作,并没有创造新的概率,也没有让任何概率消失,它只是把每个格子的概率按照一定的规则(成功移动或失败移动)转移到其他格子上。

我们来分析一下你的代码(前向传播/加法思路),看看为什么概率总和不变:

移动前,我们假设 sum(p) == 1

q = [[0, …], …] # q的总和是0

for row in range(row_num_max):
for col in range(col_num_max):

我们把 p[row][col] 这个概率值分成两部分

    prob_to_move = p[row][col] * p_move
    prob_to_stay = p[row][col] * (1 - p_move)

    # 注意:prob_to_move + prob_to_stay = p[row][col] * (p_move + 1 - p_move) = p[row][col]
    # 这说明我们只是把 p[row][col] 的概率拆开了,总数没变

    # 然后我们把这两部分概率加到新的分布q中
    q[exp_row][exp_col] += prob_to_move
    q[row][col] += prob_to_stay

python

在整个循环中,我们对每一个 p[row][col] 都做了这样的拆分和重新分配。因为每次拆分都没有损失或增加概率(prob_to_move + prob_to_stay 恰好等于 p[row][col]),所以当我们遍历完所有的格子后,q 的总和就精确地等于原来 p 的总和。

既然移动前 sum(p) 是1,那么移动后 sum(q) 也必然是1。所以,不需要再进行归一化。

测量更新为什么需要归一化?
与运动更新不同,测量更新(Measurement Update)会改变概率的总和。

测量前,sum(p) == 1

for row in range(row_num_max):
for col in range(col_num_max):

我们用一个小于1的系数(sensor_right 或 1-sensor_right)去乘以原来的概率

    q[row][col] = p[row][col] * (hit * sensor_right + (1-hit) * (1-sensor_right))

python

因为 sensor_right 和 1-sensor_right 通常都小于1,所以 q[row][col] 会小于 p[row][col]。当我们把所有的 q 加起来时,它的总和 s 几乎肯定会小于1。

这个操作引入了新的信息,使得我们对某些位置更加“确定”,对另一些位置更加“不确定”,但这个过程本身不是一个封闭的概率转移。为了让 q 重新成为一个有效的概率分布(总和为1),我们必须将它的每一项都除以总和 s。这就是归一化的过程。

结论
运动更新 (Motion Update):是一个封闭系统的概率重新分配。总概率保持不变,因此不需要归一化。
测量更新 (Measurement Update):是一个开放系统,它根据外部信息调整概率。总概率会发生变化(通常是减小),因此必须进行归一化,使其重新成为有效的概率分布


评论