将数组规范化为总和为1.0的两种方法

时间:2017-09-11 16:53:18

标签: python numpy normalization checksum

我对两种方法感到困惑,即数组被规范化并且必须总计为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])

方法1:

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 ])

方法2:

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])

哪种方法正确?为什么?

1 个答案:

答案 0 :(得分:3)

这两种方法都将values修改为总和为1的数组,但它们的执行方式不同。

第一种方法:仅缩放

方法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       ])