将数组归一化以使总和为 1.0 的两种方法
Posted
技术标签:
【中文标题】将数组归一化以使总和为 1.0 的两种方法【英文标题】:Two methods to normalise array to sum total to 1.0 【发布时间】:2018-02-19 23:47:45 【问题描述】:我被两种方法弄糊涂了,数组被归一化并且总和必须为 1.0:
要标准化的数组:
array([ 1.17091033, 1.13843561, 1.240346 , 1.05438719, 1.05386014,
1.15475574, 1.16127814, 1.07070739, 0.93670444, 1.20450255,
1.25644135])
方法一:
arr = np.array(values / min(values))
array([ 1.25003179, 1.21536267, 1.32415941, 1.12563488, 1.12507221,
1.23278559, 1.23974873, 1.14305788, 1.00000000, 1.28589392,
1.34134236])
arr1 = arr / sum(arr) # Sum total to 1.0
array([ 0.09410701, 0.09149699, 0.09968761, 0.08474195, 0.08469959,
0.09280865, 0.09333286, 0.08605362, 0.07528369, 0.09680684,
0.1009812 ])
方法二:
arr = np.array((values - min(values)) / (max(values) - min(values)))
array([ 0.73249564, 0.63092863, 0.94966065, 0.3680612, 0.3664128 ,
0.68197101, 0.70237028, 0.41910379, 0.0000000, 0.83755771,
1.00000000])
arr2 = arr / sum(arr) # Sum total to 1.0
array([ 0.10951467, 0.09432949, 0.14198279, 0.05502845, 0.054782 ,
0.10196079, 0.10501066, 0.06265978, 0.00000000, 0.12522239,
0.14950897])
哪种方法是正确的?为什么?
【问题讨论】:
arr / sum(arr)
是规范化(它是正确的)。另外两个是“缩放”,你应该使用哪一个取决于上下文。
在数组上调用sum
通常是个坏主意;您应该改用np.sum
,它更快并且可以更好地处理多维数组。
谢谢@user2357112
无论是否使用 numpy,仍然要小心,因为 float 实现可能会导致您的总和与 1.0 相差很小。查找“softmax 函数”了解更多
感谢@Brad Solomon
【参考方案1】:
这两种方法都将values
修改为一个总和为1
的数组,但它们的做法不同。
第一种方法:仅缩放
方法一的第一步是对数组进行缩放,使最小值变为1
。此步骤不是必需的,如果 values
具有 0
元素,则该步骤将不起作用。
>>> import numpy as np
>>> values = np.array([2, 4, 6, 8])
>>> arr1 = values / values.min()
>>> arr1
array([ 1., 2., 3., 4.])
方法 1 的第二步对数组进行缩放,使其总和变为 1
。通过这样做,它会覆盖第一步所做的任何更改。你不需要arr1
:
>>> arr1 / arr1.sum()
array([ 0.1, 0.2, 0.3, 0.4])
>>> values / values.sum()
array([ 0.1, 0.2, 0.3, 0.4])
第二种方法:偏移+缩放
方法2第一步对数组进行偏移和缩放,使最小值变为0
,最大值变为1
:
>>> arr2 = (values - values.min()) / (values.max() - values.min())
>>> arr2
array([ 0. , 0.33333333, 0.66666667, 1. ])
方法 2 的第二步对数组进行缩放,使总和变为1
。步骤 1 的偏移量仍会应用,但会覆盖步骤 1 的缩放比例。注意最小元素是0
:
>>> arr2 / arr2.sum()
array([ 0. , 0.16666667, 0.33333333, 0.5 ])
你可以直接从values
得到这个结果:
>>> (values - values.min()) / (values - values.min()).sum()
array([ 0. , 0.16666667, 0.33333333, 0.5 ])
【讨论】:
以上是关于将数组归一化以使总和为 1.0 的两种方法的主要内容,如果未能解决你的问题,请参考以下文章