チュートリアルで見た(それ以上の説明はありませんでした)x -= np.mean(x, axis=0)
を使用してデータをゼロ平均に処理し、x /= np.std(x, axis=0)
を使用してデータを正規化できます。誰もがコードのこれらの2つの部分について詳しく説明できますか、ドキュメントから得た唯一のことは、np.mean
が算術平均を計算し、特定の軸に沿って平均を計算し、np.std
が標準偏差を計算することです.
これは、いわゆる 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
の平均がすべてのエントリから減算されます。 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)
ここで重要なのは、代入演算子です。実際には、元の変数に対していくつかの操作を実行します。 a + = cは、実際にはa = a + cと等しくなります。
したがって、実際に(あなたの場合はx)を事前に定義する必要があります。
各メソッドは、入力として配列/反復可能(x)を受け取り、値(または多次元配列が入力された場合は配列)を出力します。したがって、割り当て操作に適用されます。
軸パラメーターは、行に対して平均または標準操作を適用することを意味します。したがって、特定の列の各行の値を取得し、平均または標準を実行します。 Axis = 1は、特定の行の各列の値を取ります。
両方の操作で行うことは、最初に平均を削除して、列の平均が0を中心とするようにすることです。その後、stdで除算すると、このゼロの周りのデータの広がりが減ります。 0を中心とする[-1、+1]間隔である。
したがって、各列の値はゼロを中心にして標準化されています。
最小値または最大値を削除し、値の範囲で除算するなど、他のスケーリング手法があります。