ループを回避するには、列の平均値を中心にしてデータのマトリックスを中央に配置し、各エントリを標準偏差でスケーリングします(列単位または行ごとに)?scale()Octave/MatlabのR関数に相当する
これは簡単です:scale(data, center = T, scale = T))
です。
しかし私はOcataveやMatlabで同じ基本的な前処理をどのように達成するのか分かりません。
ループを回避するには、列の平均値を中心にしてデータのマトリックスを中央に配置し、各エントリを標準偏差でスケーリングします(列単位または行ごとに)?scale()Octave/MatlabのR関数に相当する
これは簡単です:scale(data, center = T, scale = T))
です。
しかし私はOcataveやMatlabで同じ基本的な前処理をどのように達成するのか分かりません。
これを実行する関数は1つではありませんが、std
とmean
にはdim
パラメータを使用してこれを行うことができます。 bsxfun
を使用して、すべてを1行にまとめることもできます。
A = rand(5, 4);
% Column-wise
bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 1)), std(A, [], 1))
% Row-wise
bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 2)), std(A, [], 2))
説明
mean
にdim
パラメータを用いて、我々はA
の各列の平均値を計算することができます。
M = mean(A, 1)
その後、我々は、各列(@minus
)の各値から平均値を減算するbsxfun
を使用することができます。 M
が1 x nCols
、A
がnRows x nCols
なのでbsxfun
を使用する必要があります。 bsxfun
が自動的に操作をブロードキャストします。
B = bsxfun(@minus, A, M);
その後、我々は再びdim
パラメータ(第3の入力)を使用して、各列の標準偏差を計算します。
S = std(A, [], 1)
そして、この標準偏差で各列を分割
bsxfun(@rdivide, B, S);
だから我々は、行ごとの操作を実行するには
bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 1)), std(A, [], 1))
を取得し、すべて一緒にこれをもたらし、私たちが行う必要があるすべてがあります
dim
パラメータを1(列)から2(行)に切り替えます。
Octaveには、このcenter()とzscore()の2つの関数があります。 zscoreはまた、その平均値を減算することにより、SD(標準化として知られているように時々知られる操作)
中心(X)
センターデータで除算に対し、中心がちょうど、平均値を減算します。
xがベクトルの場合、その平均を減算します。 xが行列の場合は、それぞれ 列に対して上記を実行します。オプションの引数dimが指定されている場合は、この 次元に沿って操作します。
と
zscore(X、オプトイン、dim)は、xがベクトルである場合、その標準偏差で、その平均値と除算を減算X
のZスコアを計算します。 標準偏差がゼロの場合は、代わりに1で割ります。
オプションのパラメータoptは、 が標準偏差を計算し、 対応するstdのパラメータと同じ定義を持つ場合に使用する正規化を決定します。
xが行列の場合、最初の非シングルトン次元に沿って計算します。 3番目の省略可能な引数dimが指定されている場合は、この ディメンションに沿って操作します。
あなたはこれを見ましたか? http://stackoverflow.com/questions/4521593/fast-technique-for-normalizing-a-matrix-in-matlab – Gopala