目录
问题表述
x_iter的取值范围为
np.array([[-1, 1], [-1, 1], [-1, 1], [-1, 1]])
实际x的取值范围是
np.array([[-10000, 10000], [-10000, 10000], [-10000, 10000], [-10000, 10000]])
已知一组x_iter值如下,需要将其等效为实际x的值:
[[ 0.1 0.5 0.5 0.9]
[-0.9 0.3 -0.7 0.5]
[-0.1 0.7 -0.5 0.7]
[-0.5 0.9 -0.9 -0.7]
[-0.3 -0.5 0.1 -0.9]
[ 0.3 -0.7 0.3 0.3]
[ 0.5 -0.1 0.7 0.1]
[ 0.9 0.1 -0.3 -0.5]
[-0.7 -0.3 0.9 -0.3]
[ 0.7 -0.9 -0.1 -0.1]]
用以下代码:
# 取值范围
bounds = np.array([[-1, 1], [-1, 1], [-1, 1], [-1, 1]])
real_bounds = np.array([[-10000, 10000], [-10000, 10000], [-10000, 10000], [-10000, 10000]])
# 给定一组值
x_iter = np.array([[ 0.1, 0.5, 0.5, 0.9],
[-0.9, 0.3, -0.7, 0.5],
[-0.1, 0.7, -0.5, 0.7],
[-0.5, 0.9, -0.9, -0.7],
[-0.3, -0.5, 0.1, -0.9],
[ 0.3, -0.7, 0.3, 0.3],
[ 0.5, -0.1, 0.7, 0.1],
[ 0.9, 0.1, -0.3, -0.5],
[-0.7, -0.3, 0.9, -0.3],
[ 0.7, -0.9, -0.1, -0.1]])
# 映射到真实范围中
rescaled_x = np.zeros(x_iter.shape)
for i in range(bounds.shape[0]):
rescaled_x[:, i] = (x_iter[:, i] - bounds[i, 0]) / (bounds[i, 1] - bounds[i, 0]) * (real_bounds[i, 1] - real_bounds[i, 0]) + real_bounds[i, 0]
print(rescaled_x)
结果:
[[ 1000. 5000. 5000. 9000.]
[-9000. 3000. -7000. 5000.]
[-1000. 7000. -5000. 7000.]
[-5000. 9000. -9000. -7000.]
[-3000. -5000. 1000. -9000.]
[ 3000. -7000. 3000. 3000.]
[ 5000. -1000. 7000. 1000.]
[ 9000. 1000. -3000. -5000.]
[-7000. -3000. 9000. -3000.]
[ 7000. -9000. -1000. -1000.]]
代码解释
用以下这种代码便于理解:
original_data = np.array([[ 0.1, 0.5, 0.5, 0.9],
[-0.9, 0.3, -0.7, 0.5],
[-0.1, 0.7, -0.5, 0.7],
[-0.5, 0.9, -0.9, -0.7],
[-0.3, -0.5, 0.1, -0.9],
[ 0.3, -0.7, 0.3, 0.3],
[ 0.5, -0.1, 0.7, 0.1],
[ 0.9, 0.1, -0.3, -0.5],
[-0.7, -0.3, 0.9, -0.3],
[ 0.7, -0.9, -0.1, -0.1]])
min_old, max_old = -1, 1
min_new, max_new = -10000, 10000
rescaled_data = (original_data - min_old) / (max_old - min_old) * (max_new - min_new) + min_new
这段代码的目的是将矩阵original_data
的所有元素从[-1,1]的范围等效转换到[-10000,10000]的范围。
这个公式 (original_data - min_old) / (max_old - min_old) * (max_new - min_new) + min_new
是一种被称为归一化的方法,它把数据从一个范围转换到另一个范围。
这是一种线性转换,它首先把元素从原始范围转换到[0,1](这一步通过(original_data - min_old) / (max_old - min_old)
实现),然后再把元素从[0,1]转换到目标范围[ min_new, max_new]((max_new - min_new) + min_new
进行这个转换)。
这个公式进行的变换是带有缩放和平移的线性变换,对每个元素都做同样的处理。这样做可以保证数据的最大值和最小值分别映射到目标范围的最大值和最小值。
最后,rescaled_data
这个新矩阵就是将original_data
的元素经过这种线性转换处理后的结果。