归一化值,加起来大于 1

Normalized values, when summed are more than 1

我有两个文件:

文件 1:

  TOPIC:topic_0 1294
  aa 234
  bb 123

  TOPIC:topic_1 2348
  aa 833
  cc 239
  bb 233

文件 2:

0.1 0.2 0.3 0.4 

这只是我的文件格式。基本上,当第二列(省略第一 "TOPIC" 行)为每个主题求和时,它构成为 1,因为它们是标准化值。同样,在文件 2 中,值被归一化,因此它们也构成 1。

我将文件 1 和 2 的值相乘。生成的输出文件如下所示:

aa 231
bb 379
cc 773

输出文件求和后的第二列应为 1。但很少有文件的值略大于 1,如 1.1、1.00038。如何精确地为输出文件获取 1?我应该做一些四舍五入吗?

PS: 格式仅为示例,数值和字词不同。这仅用于理解目的。请帮我整理一下。

Python 以 2 进制存储浮点小数。

https://docs.python.org/2/tutorial/floatingpoint.html

这意味着某些小数可能以 10 为底终止,但以 2 为底重复,因此在将它们相加时会出现浮点错误。

这涉及到一些数学问题,但想象一下以 10 为基数试图表达 2/6 的值。当您从分子和分母中消除公因子时,它是 1/3。

它是 0.333333333..... 永远重复。我稍后会解释为什么,但现在,请理解如果只存储小数点的前 16 位,例如,当您将数字乘以 3 时,您不会得到 1,您将得到 .9999999999999999 ,有点偏了。

只要有重复的小数,就会出现此舍入错误。

这就是为什么您的数字不以 10 进制重复,但以 2 进制重复。

小数以 10 为底,素因数为 2^1 * 5^1。因此,对于以 10 为底的任何比率,其分母必须是 2 和 5 的组合的质因数,除此之外别无其他。

现在让我们回到Python。每个小数都存储为二进制。这意味着为了使比率的 "decimal" 终止,分母必须仅是 2 的质因数。

您的号码以 2 为基数重复。

1/10 的分母为 (2*5)。 2/10 减少到 1/5,分母仍然是 5。 3/10...好吧,你明白了。