我有一个只包含正值的数据列表,如下面的列表:
data_list = [3.34, 2.16, 8.64, 4.41, 5.0]
是否有一种方法将该列表规范化为从-1到+1的范围?
2.16
对应归一化范围内的-1
,8.64
对应+1
。
我找到了几个讨论如何规范化包含负数和正值的列表的主题。但是,如何将一个只有正数或负数的列表规范化成一个从负数到正数范围的新的规范化列表呢?
虽然有现成的库函数可用,但您可以非常容易地通过简单的列表推导来复制该逻辑。
data_list = [3.34, 2.16, 8.64, 4.41, 5.0]
minL = min(data_list)
maxL = max(data_list)
normalised = [((x - minL) * 2)/(maxL - minL) - 1 for x in data_list]
print(normalised) # [-0.6358024691358026, -1.0, 1.0, -0.3055555555555556, -0.1234567901234569]
对于numpy,您可以使用interp
:
#pip install numpy
import numpy as np
data_list = [0.54, 2.16, 8.35, 0.35, 1.1]
out = np.interp(x=data_list, xp=(min(data_list), max(data_list)), fp=(-1, +1)).tolist()
输出:
print(out)
# [-0.9525, -0.5475, 1.0, -1.0, -0.8125]
您不需要为这样的任务导入库。归一化数学很简单。
要在0到1之间归一化,取每个值,减去列表的最小值,然后除以最大值减去最小值。
def normalise(data):
data_max=max(data)
data_min=min(data
for i,n in enumerate(data):
data[i]=(n-data_min)/(data_max-data_min)
return(data)
要更改它的缩放范围,您需要将其乘以范围的跨度(即abs(max_value-min_value)
),然后添加下限。
def normalise_to_range(data,min_value,max_value):
data_max=max(data)
data_min=min(data)
span=abs(max_value-min_value)
for i,n in enumerate(data):
data[i]=span*(n-data_min)/(data_max-data_min)+min_value
return(data)
使用您的数据并将范围设置为-1,1:
data_list = [0.54, 2.16, 8.35, 0.35, 1.1]
normalise_to_range(data_list,-1,1)
#[-0.9525, -0.5475, 1.0, -1.0, -0.8125]