15

我在教程中看到(没有进一步的解释),我们可以使用 将数据处理为零均值x -= np.mean(x, axis=0)并使用x /= np.std(x, axis=0). 任何人都可以详细说明这两段代码,我从文档中得到的唯一信息是np.mean计算算术平均值沿特定轴计算平均值,np.std并为标准偏差这样做。

4

4 回答 4

22

这也称为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])
于 2017-08-23T08:48:15.543 回答
12

按照下面代码中的注释

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)
于 2017-08-23T08:24:19.930 回答
5

根据您给定的语法,我得出结论,您的数组是多维的。因此,我将首先讨论您的 x 只是一个线性数组的情况:

np.mean(x)将通过广播从所有条目中减去 x-np.mean(x)的平均值来计算平均值。相当于x/np.std(x)`。xx -=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)
于 2017-08-23T08:29:27.853 回答
2

这里的关键是赋值运算符。他们实际上对原始变量执行了一些操作。a += c 实际上等于 a=a+c。

所以确实必须事先定义一个(在你的情况下是x)。

每个方法都将一个数组/可迭代 (x) 作为输入并输出一个值(如果输入的是多维数组,则输出一个数组),因此将其应用于您的赋值操作。
轴参数意味着您对行应用均值或标准差操作。因此,您为给定列中的每一行取值并执行平均值或标准差。Axis=1 将获取给定行的每一列的值。

你对这两个操作所做的是首先你删除平均值,以便你的列平均值现在以 0 为中心。然后,当你除以标准时,你碰巧减少了这个零附近的数据分布,现在它应该大致在 0 左右的 [-1, +1] 区间内。

所以现在,您的每个列值都以零为中心并标准化。

还有其他缩放技术,例如删除最小值或最大值并除以值的范围。

于 2017-08-23T08:28:43.057 回答