【问题标题】:I am getting runtime warnings when trying to normalize and update weights尝试规范化和更新权重时收到运行时警告
【发布时间】:2020-10-21 07:27:41
【问题描述】:

我正在尝试计算粒子过滤器中某些粒子的权重,然后相应地对这些权重进行归一化。我的代码:

def update(particles, weights, landmark, sigma):
    n = 0.0
    for i in range(len(weights)):
        distance = np.power((particles[i][0] - landmark[0]) ** 2 + (particles[i][1] - 
        landmark[1])**2, 0.5)
        likelihood = exp(-(np.power(distance, 2))/2 * sigma ** 2)
        weights[i] = weights[i] * likelihood
        n += weights[i]
        weights += 1.e-30
        if n != 0:
            weights = weights / n

但是,我收到错误消息: /Users/scottdayton/PycharmProjects/Uncertainty Research/particle.py:30:RuntimeWarning:在 true_divide 中遇到溢出 权重 = 权重 / n /Users/scottdayton/PycharmProjects/Uncertainty Research/particle.py:30:RuntimeWarning:在 true_divide 中遇到无效值 权重 = 权重 / n

【问题讨论】:

  • 请提供输入值以帮助您。您可能在第 6 行有一个错误,您可能在分母中缺少括号,也许您想写 exp(-(np.power(distance,2))/(2*sigma**2)) 而不是 exp(-(np.power(distance,2))/2*sigma**2)?高斯分布的表达式。
  • 谢谢,我认为这有效!
  • 可能还有错误,但我需要修改代码。我会发送一个答案,请告诉我我错了。
  • 你应该使用 log sum exp 技巧。为什么要随机添加 1e-30?另外,我没有看到任何重采样。

标签: python numpy gaussian particle-filter normalizing


【解决方案1】:

正如 cmets 中所说,我在您的代码中添加了括号,但可能还有另一件事。我觉得您正在尝试将权重与可能性相乘,然后对结果进行归一化。为此,您应该在 2 中切断循环:

  • 权重和总和的更正。
  • 归一化归一化。

我会这样写:

def update(particles, weights, landmark, sigma):
    n = 0.0
    # Correction of weights and computation of the sum
    for i in range(len(weights)):
        distance = np.power((particles[i][0] - landmark[0]) ** 2 + (particles[i][1] - 
        landmark[1])**2, 0.5)
        likelihood = np.exp(-(np.power(distance, 2))/(2 * sigma ** 2))
        weights[i] = weights[i] * likelihood + 1.e-30
        n += weights[i]
    # Normalization to sum up to one
    for i in range(len(weights)):
        weights[i] = weights[i] / n

【讨论】:

    猜你喜欢
    • 2021-07-12
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多