Python 我在尝试规范化和更新权重时收到运行时警告

Python 我在尝试规范化和更新权重时收到运行时警告,python,numpy,gaussian,particle-filter,normalizing,Python,Numpy,Gaussian,Particle Filter,Normalizing,我试图在粒子过滤器中计算某些粒子的权重,然后相应地规范化这些权重。我的代码: 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)

我试图在粒子过滤器中计算某些粒子的权重,然后相应地规范化这些权重。我的代码:

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/pycharm项目/不确定性研究/particle.py:30:RuntimeWarning:true_divide中遇到溢出 重量=重量/n /Users/scottdayton/pycharm项目/不确定性研究/particle.py:30:RuntimeWarning:在真除法中遇到无效值
weights=weights/n

正如在评论中所说的,我在代码中添加了括号,但可能还有另一件事。我觉得你是在尝试将权重与可能性相乘,然后将结果标准化。为此,应将循环切割为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

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