web-dev-qa-db-ja.com

Numpy:ゼロ平均データと標準化

チュートリアルで見た(それ以上の説明はありませんでした)x -= np.mean(x, axis=0)を使用してデータをゼロ平均に処理し、x /= np.std(x, axis=0)を使用してデータを正規化できます。誰もがコードのこれらの2つの部分について詳しく説明できますか、ドキュメントから得た唯一のことは、np.meanが算術平均を計算し、特定の軸に沿って平均を計算し、np.stdが標準偏差を計算することです.

9
econ

これは、いわゆる 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])
11
Jonas Adler

以下のコードのコメントに従ってください

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)
7
Clock Slave

与えられた構文から、あなたの配列は多次元であると結論付けました。したがって、まず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) `と同等です。

多次元配列の場合も同じことが起こりますが、配列全体の平均を計算する代わりに、最初の「軸」の平均を計算するだけです。軸は、ディメンションのnumpy Wordです。したがって、xが2次元の場合、np.mean(x,axis =0) = [np.mean(x[:,0], np.mean(x[:,1])...]です。再度ブロードキャストすると、これがすべての要素に対して行われます。

これは最初の次元でのみ機能することに注意してください。そうでない場合、形状は放送用に一致しません。別の軸で正規化する場合は、次のようにする必要があります。

x -= np.expand_dims(np.mean(x,axis = n),n)
3

ここで重要なのは、代入演算子です。実際には、元の変数に対していくつかの操作を実行します。 a + = cは、実際にはa = a + cと等しくなります。

したがって、実際に(あなたの場合はx)を事前に定義する必要があります。

各メソッドは、入力として配列/反復可能(x)を受け取り、値(または多次元配列が入力された場合は配列)を出力します。したがって、割り当て操作に適用されます。
軸パラメーターは、行に対して平均または標準操作を適用することを意味します。したがって、特定の列の各行の値を取得し、平均または標準を実行します。 Axis = 1は、特定の行の各列の値を取ります。

両方の操作で行うことは、最初に平均を削除して、列の平均が0を中心とするようにすることです。その後、stdで除算すると、このゼロの周りのデータの広がりが減ります。 0を中心とする[-1、+1]間隔である。

したがって、各列の値はゼロを中心にして標準化されています。

最小値または最大値を削除し、値の範囲で除算するなど、他のスケーリング手法があります。

2
Ando Jurai