我在教程中看到(没有进一步的解释),我们可以使用 将数据处理为零均值x -= np.mean(x, axis=0)
并使用x /= np.std(x, axis=0)
. 任何人都可以详细说明这两段代码,我从文档中得到的唯一信息是np.mean
计算算术平均值沿特定轴计算平均值,np.std
并为标准偏差这样做。
4 回答
这也称为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])
按照下面代码中的注释
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)
根据您给定的语法,我得出结论,您的数组是多维的。因此,我将首先讨论您的 x 只是一个线性数组的情况:
np.mean(x)
将通过广播从所有条目中减去 x-np.mean(x)
的平均值来计算平均值。相当于x/np.std(x)`。x
x -=np.mean(x,axis = 0)
x = x-np.mean(x,axis = 0). Similar for
在多维数组的情况下,也会发生同样的事情,但不是计算整个数组的平均值,而是计算第一个“轴”上的平均值。轴是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)
这里的关键是赋值运算符。他们实际上对原始变量执行了一些操作。a += c 实际上等于 a=a+c。
所以确实必须事先定义一个(在你的情况下是x)。
每个方法都将一个数组/可迭代 (x) 作为输入并输出一个值(如果输入的是多维数组,则输出一个数组),因此将其应用于您的赋值操作。
轴参数意味着您对行应用均值或标准差操作。因此,您为给定列中的每一行取值并执行平均值或标准差。Axis=1 将获取给定行的每一列的值。
你对这两个操作所做的是首先你删除平均值,以便你的列平均值现在以 0 为中心。然后,当你除以标准时,你碰巧减少了这个零附近的数据分布,现在它应该大致在 0 左右的 [-1, +1] 区间内。
所以现在,您的每个列值都以零为中心并标准化。
还有其他缩放技术,例如删除最小值或最大值并除以值的范围。