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