引言
由于目前网上似乎没有博客详细介绍Sklearn的归一化函数MinMaxScalar到底是如何实现数据归一化的,而笔者也不确定生成的scalar的对象能不能完成数据单一映射而对实验结果的精度造成影响,于是有了此篇文章。本文通过生成的格式化数据,对MinMaxScalar函数的处理机制进行了探讨和介绍。通过这篇文章,你可能会发现该函数的机制似乎和你想的不一样(手动滑稽)
正文
实验一
- 第一步是导入包,然后生成一个4X4的矩阵如下
from sklearn.preprocessing import MinMaxScaler
import numpy as np
data = np.reshape(np.arange(0,16,1),(4,4))
print(data)
可以看到生成数据如下:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
- 第二步,接着我们看一下,归一化后的数据长什么样子:
scalar = MinMaxScaler(feature_range=(0,1))
scalar_data = scalar.fit_transform(data)
print(scalar_data)
结果如下:
[[0. 0. 0. 0. ]
[0.33333333 0.33333333 0.33333333 0.33333333]
[0.66666667 0.66666667 0.66666667 0.66666667]
[1. 1. 1. 1. ]]
你会惊讶发现,这个归一化是按照列元素进行的,因此我蒙逼了,这样对数据进行归一化,不会产生数据失真吗?对于每行来说,原来不同的数据,全部变成了同样的值(当然不会啦,按列归一化就是按feature元素进行归一化)。
- 第三步,将数据反向映射回去
print(scalar.inverse_transform(scalar_data))
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]
[12. 13. 14. 15.]]
从反归一化结果可以看出,该方法的确是按照列进行归一化的
实验二
- 我们把
scalar_data
在第0维上只取前3个元素(行元素),并反向归一化
scalar_data2=scalar_data[:3]
print(scalar_data2)
print(scalar.inverse_transform(scalar_data2))
[[0. 0. 0. 0. ]
[0.33333333 0.33333333 0.33333333 0.33333333]
[0.66666667 0.66666667 0.66666667 0.66666667]]
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]]
可以发现,数据可以正确的反向还原
实验二
- 我们把scalar_data 在第1维上只取前3个元素(列元素),并反向归一化
scalar_data3=scalar_data[:,:3]
print(scalar_data3)
print(scalar.inverse_transform(scalar_data3))
[[0. 0. 0. ]
[0.33333333 0.33333333 0.33333333]
[0.66666667 0.66666667 0.66666667]
[1. 1. 1. ]]
Traceback (most recent call last):
File "/home/jason/PycharmProjects/tf-rnn-attention/demo/testing_for_scalar.py", line 26, in <module>
print(scalar.inverse_transform(scalar_data3))
File "/home/jason/PycharmProjects/reiforcementLearning/venv/lib/python3.5/site-packages/sklearn/preprocessing/data.py", line 406, in inverse_transform
X -= self.min_
ValueError: operands could not be broadcast together with shapes (4,3) (4,) (4,3)
发现格式报错。
- PS :我同时测试了一维数组和3维的张量,结果均报错,该方法传入数据必须为为2维矩阵
ValueError: Expected 2D array, got 1D array instead:
array=[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.].
Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.
结论
好了,通过上面的简单实验,我们其实可以发现,MinMaxScalar按照列元素进行归一化,其实就是按照feature进行归一化。
虽然,实验很简单,但是把问题搞清楚,希望对自己和大家都有所帮助
分享是一种生活的信念,明白了分享的同时,明白了存在的意义