将数组归一化以使总和为 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 的两种方法的主要内容,如果未能解决你的问题,请参考以下文章

数据归一化和两种常用的归一化方法

数据归一化和两种常用的归一化方法

数据归一化和两种常用的归一化方法

通过简单案例-深入理解深度学习中两种常用的归一化方法

如何通过 Hive 中数组的总和对数组进行归一化?

Python 3 接口与归一化设计