将浮点数列表归一化为概率

Normalize list of floats to probabilities

提问人:Umberto Fontanazza 提问时间:11/12/2023 更新时间:11/15/2023 访问量:100

问:

我有一个概率权重列表,我想对其进行归一化,以便.weights = [3, 7, 4, 2]sum(weights) == 1

这在以后可以用于类似“random.choice 的加权版本”和 numpy.random.choice

目前我正在做这样的事情:

norm_one = sum(weights)
probabilities = [x / norm_one for x in weights]

我想知道我正在做的事情是否有任何问题,因为浮点数是用有限位数表示的,并且列表的总和可能不等于 1,并且是否有内置函数来规范化我应该使用的列表或 numpy.array(或任何更好的方法)

Python NumPy 概率 归一化

评论

3赞 Kelly Bundy 11/12/2023
为什么不使用 NumPy 进行计算?
0赞 Umberto Fontanazza 11/12/2023
只是因为我对numpy不太有信心,但numpy的答案也被接受
1赞 wjandrea 11/13/2023
这是你要找的吗?如何使numpy数组列总和达到1。(如果你的数据是一维的,你可以在Divakar的答案中删除这个参数。axis
1赞 wjandrea 11/13/2023
@Umberto 我自己不是专家,但我找到了另一种解决方案,sklearn.preprocessing.normalize(a, norm='l1'),但它完全是 2D
1赞 pho 11/13/2023
你的评论让你看起来想让你的代码更具可读性——你的代码是相当可读的,如果你只想用它们做这个规范化,我不会添加像numpy或sklearn这样的依赖项。如果这些数组很大,numpy 将很有用,因为它会将计算从缓慢的 python 代码中移出。只要使用浮点数,仍然会遇到浮点精度错误

答:

1赞 Viktor Veselý 11/15/2023 #1

从技术上讲,你是对的,可能会发生总和相等的情况,但像 Numpy 和 Pandas 这样的包并不关心这一点,它会正常工作(python 的魔力)。1 +- very_small_number

正如其他人在评论中指出的那样,使用 numpy 进行规范化

  1. 在处理大型数组时,它会快得多
  2. 它会不那么冗长

法典:

import numpy as np

weights = np.array([5, 18, 7])
probabilities = weights / weights.sum()