将数组归一化为总和为 1.0 的两种方法
Two methods to normalise array to sum total to 1.0
我对数组标准化且总和必须为 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])
哪种方法是正确的?为什么?
两种方法都将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
。通过这样做,它会覆盖第一步所做的任何更改。你不需要 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])
第二种方法:偏移+缩放
方法二第一步对数组进行偏移缩放,使最小值变为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 的两种方法感到困惑:
待规范化的数组:
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])
哪种方法是正确的?为什么?
两种方法都将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
。通过这样做,它会覆盖第一步所做的任何更改。你不需要 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])
第二种方法:偏移+缩放
方法二第一步对数组进行偏移缩放,使最小值变为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 ])