Numpy:zero 均值数据和标准化
Numpy:zero mean data and standardization
我在教程中看到(没有进一步解释)我们可以使用 x -= np.mean(x, axis=0)
将数据处理为零均值并使用 x /= np.std(x, axis=0)
对数据进行归一化。谁能详细说明这两段代码,我从文档中得到的唯一信息是 np.mean
计算算术平均值计算沿特定轴的平均值,而 np.std
计算标准差。
关注下方代码中的注释
import numpy as np
# create x
x = np.asarray([1,2,3,4], dtype=np.float64)
np.mean(x) # calculates the mean of the array x
x-np.mean(x) # this is euivalent to subtracting the mean of x from each value in x
x-=np.mean(x) # the -= means can be read as x = x- np.mean(x)
np.std(x) # this calcualtes the standard deviation of the array
x/=np.std(x) # the /= means can be read as x = x/np.std(x)
这里的关键是赋值运算符。它们实际上对原始变量执行一些操作。
a += c 实际上等于 a=a+c。
所以确实 a(在你的情况下是 x)必须事先定义。
每个方法都将 array/iterable (x) 作为输入并输出一个值(如果输入的是多维数组,则为数组),因此应用于您的赋值操作。
axis 参数意味着您对行应用均值或标准操作。因此,您为给定列中的每一行取值并执行平均值或标准差。
Axis=1 将获取给定行的每一列的值。
你对这两个操作所做的是,首先你删除平均值,这样你的列平均值现在以 0 为中心。然后,当你除以标准差时,你恰好减少了这个零周围的数据分布,现在它应该大致在 0 左右的 [-1, +1] 区间内。
现在,您的每个列值都以零为中心并标准化。
还有其他缩放技术,例如删除最小值或最大值并除以值的范围。
根据您给出的语法,我得出结论,您的数组是多维的。因此,我将首先讨论您的 x 只是一个线性数组的情况:
np.mean(x)
将计算平均值,通过广播 x-np.mean(x)
将从所有条目中减去 x
的平均值。 x -=np.mean(x,axis = 0)
等同于 x = x-np.mean(x,axis = 0). Similar for
x/np.std(x)`.
在多维数组的情况下会发生同样的事情,但不是计算整个数组的平均值,而是计算第一个 "axis" 的平均值。轴是维度的 numpy
词。所以如果你的 x
是二维的,那么 np.mean(x,axis =0) = [np.mean(x[:,0], np.mean(x[:,1])...]
。再次广播将确保对所有元素完成此操作。
请注意,这仅适用于第一维,否则形状将无法匹配广播。如果你想标准化另一个轴你需要做这样的事情:
x -= np.expand_dims(np.mean(x,axis = n),n)
这也叫zscore
.
SciPy 有一个实用程序:
>>> from scipy import stats
>>> stats.zscore([ 0.7972, 0.0767, 0.4383, 0.7866, 0.8091,
... 0.1954, 0.6307, 0.6599, 0.1065, 0.0508])
array([ 1.1273, -1.247 , -0.0552, 1.0923, 1.1664, -0.8559, 0.5786,
0.6748, -1.1488, -1.3324])
我在教程中看到(没有进一步解释)我们可以使用 x -= np.mean(x, axis=0)
将数据处理为零均值并使用 x /= np.std(x, axis=0)
对数据进行归一化。谁能详细说明这两段代码,我从文档中得到的唯一信息是 np.mean
计算算术平均值计算沿特定轴的平均值,而 np.std
计算标准差。
关注下方代码中的注释
import numpy as np
# create x
x = np.asarray([1,2,3,4], dtype=np.float64)
np.mean(x) # calculates the mean of the array x
x-np.mean(x) # this is euivalent to subtracting the mean of x from each value in x
x-=np.mean(x) # the -= means can be read as x = x- np.mean(x)
np.std(x) # this calcualtes the standard deviation of the array
x/=np.std(x) # the /= means can be read as x = x/np.std(x)
这里的关键是赋值运算符。它们实际上对原始变量执行一些操作。 a += c 实际上等于 a=a+c。
所以确实 a(在你的情况下是 x)必须事先定义。
每个方法都将 array/iterable (x) 作为输入并输出一个值(如果输入的是多维数组,则为数组),因此应用于您的赋值操作。
axis 参数意味着您对行应用均值或标准操作。因此,您为给定列中的每一行取值并执行平均值或标准差。
Axis=1 将获取给定行的每一列的值。
你对这两个操作所做的是,首先你删除平均值,这样你的列平均值现在以 0 为中心。然后,当你除以标准差时,你恰好减少了这个零周围的数据分布,现在它应该大致在 0 左右的 [-1, +1] 区间内。
现在,您的每个列值都以零为中心并标准化。
还有其他缩放技术,例如删除最小值或最大值并除以值的范围。
根据您给出的语法,我得出结论,您的数组是多维的。因此,我将首先讨论您的 x 只是一个线性数组的情况:
np.mean(x)
将计算平均值,通过广播 x-np.mean(x)
将从所有条目中减去 x
的平均值。 x -=np.mean(x,axis = 0)
等同于 x = x-np.mean(x,axis = 0). Similar for
x/np.std(x)`.
在多维数组的情况下会发生同样的事情,但不是计算整个数组的平均值,而是计算第一个 "axis" 的平均值。轴是维度的 numpy
词。所以如果你的 x
是二维的,那么 np.mean(x,axis =0) = [np.mean(x[:,0], np.mean(x[:,1])...]
。再次广播将确保对所有元素完成此操作。
请注意,这仅适用于第一维,否则形状将无法匹配广播。如果你想标准化另一个轴你需要做这样的事情:
x -= np.expand_dims(np.mean(x,axis = n),n)
这也叫zscore
.
SciPy 有一个实用程序:
>>> from scipy import stats
>>> stats.zscore([ 0.7972, 0.0767, 0.4383, 0.7866, 0.8091,
... 0.1954, 0.6307, 0.6599, 0.1065, 0.0508])
array([ 1.1273, -1.247 , -0.0552, 1.0923, 1.1664, -0.8559, 0.5786,
0.6748, -1.1488, -1.3324])