杨桃的Python进阶讲座10——数组array(三)数组array归一化和标准化(全网迄今最详细的讲解)

本人CSDN博客专栏:https://blog.csdn.net/yty_7

Github地址:https://github.com/yot777/

在机器学习和深度学习中的数据预处理环节,一个非常重要的步骤是对数据进行归一化标准化处理。

归一化的概念

什么是归一化?简单的说,就是通过计算把所有的数据归纳统一到指定范围中去,一般这个范围是0~1。

归一化的公式

如何进行归一化?可以通过以下两个公式进行:

(1)变换系数公式

item代表数组每列中所有的元素

max为该列所有数据的最大值,min为该列所有数据的最小值

原始array数组如下:

>>> import numpy as np
>>> data = np.array([[36,46],[45,25],[6,79]])
>>> print(data)
[[36 46]
 [45 25]
 [ 6 79]]

步骤1:求出每列的最小值和最大值

>>> n_max=np.max(data,axis=0)
>>> print(n_max)
[45 79]
>>> n_min=np.min(data,axis=0)
>>> print(n_min)
[ 6 25]

步骤2:由原始矩阵的每一个元素减去该列元素的最小值n_min,得到公式的分子

>>> fenzi = np.subtract(data,n_min)
>>> print(fenzi)
[[30 21]
 [39  0]
 [ 0 54]]

讲解:n_min原来是一维数组(,2),data是二维数组(3,2)

由于要进行数组的subtract()减法,计算中n_min由Python自动进行了广播化,变成了二维数组(3,2)

[[6 25]

 [6 25]

 [6 25]]

因此np.subtract(data,n_min)的计算过程是

步骤3:由原始矩阵的每列的最大值n_max减去每列的最小值n_min,得到公式的分母

>>> fenmu = np.subtract(n_max,n_min)
>>> print(fenmu)
[39 54]

讲解:

np.subtract(n_max,n_min)的结果是

[45 79] - [6 25] = [39 54]

 

步骤4:由分子除以分母,就得到变换系数的最终值

>>> x = np.divide(fenzi,fenmu)
>>> print(x)
[[0.76923077 0.38888889]
 [1.         0.        ]
 [0.         1.        ]]

讲解:fenzi是二维数组(3,2),fenmu是一维数组(,2)

由于要进行数组的divide()除法,计算中fenmu由Python自动进行了广播化,变成了二维数组(3,2)

[[39 54]

 [39 54]

 [39 54]]

因此np.divide(fenzi,fenmu)的计算过程是

熟练之后,以上4步可以用以下一行完成,代码如下:

>>> x = np.divide(np.subtract(data,np.min(data,axis=0)),np.subtract(np.max(data,axis=0),np.min(data,axis=0)))
>>> print(x)
[[0.76923077 0.38888889]
 [1.         0.        ]
 [0.         1.        ]]

(2)范围变换公式

mx为选定范围的最大值,mi为选定范围的最小值。

特例,如果需要归一化的值的范围就是在0~1之间,也就是mx=1,mi=0的时候无需进行范围变换,因为:

如果我们需要把x'矩阵变化到-1到1之间,也就是mx=1,mi=-1的时候:

>>> mx = 1
>>> mi = -1
>>> xx = x*(mx-mi)+mi
>>> print(xx)
[[ 0.53846154 -0.22222222]
 [ 1.         -1.        ]
 [-1.          1.        ]]

讲解:x是二维数组(3,2),mx-mi = 2,x*(mx-mi)就是

最终结果x*(mx-mi)+mi就是

标准化的概念

把每一列的数据尽可能的接近标准的高斯分布(均值为0,标准差为1)

 

标准化的公式

item代表数组每列中所有的元素,mean为该列所有数据的平均值

σ为该列所有数据的标准差

注意:mean可以由numpy的mean()函数计算,σ可以由numpy的std()函数计算

代码:

>>> import numpy as np
>>> data = np.array([[36,46],[45,25],[6,79]])
>>> print(data)
[[36 46]
 [45 25]
 [ 6 79]]

#根据标准化的公式:X = (item - mean) / σ
#item代表数组每列中所有的元素,mean为该列所有数据的平均值,σ为该列所有数据的标准差
#mean可以由numpy的mean()函数计算
>>> n_mean = np.mean(data,axis=0)
>>> print(n_mean)
[29. 50.]

##σ可以由numpy的std()函数计算
>>> n_std = np.std(data,axis=0)
>>> print(n_std)
[16.673332   22.22611077]

#将mean和σ代入公式,得到最终结果
>>> xxx = np.divide(np.subtract(data,n_mean),n_std)
>>> print(xxx)
[[ 0.4198321  -0.17996851]
 [ 0.95961623 -1.12480318]
 [-1.37944833  1.30477168]]

 

总结

1. 归一化的公式是

item代表数组每列中所有的元素

max为该列所有数据的最大值,min为该列所有数据的最小值

mx为选定范围的最大值,mi为选定范围的最小值

如果归一化的范围就是0~1,无需计算第二个公式

2. 标准化的公式是

item代表数组每列中所有的元素,mean为该列所有数据的平均值

σ为该列所有数据的标准差

mean可以由numpy的mean()函数计算,σ可以由numpy的std()函数计算

 

本人CSDN博客专栏:https://blog.csdn.net/yty_7

Github地址:https://github.com/yot777/

如果您觉得本篇本章对您有所帮助,欢迎关注、评论、点赞!Github欢迎您的Follow、Star!

发布了55 篇原创文章 · 获赞 16 · 访问量 6111

猜你喜欢

转载自blog.csdn.net/yty_7/article/details/104556013
今日推荐