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 forx/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])