2016-05-22 4 views
0

ループを回避するには、列の平均値を中心にしてデータのマトリックスを中央に配置し、各エントリを標準偏差でスケーリングします(列単位または行ごとに)?scale()Octave/MatlabのR関数に相当する

これは簡単です:scale(data, center = T, scale = T))です。

しかし私はOcataveやMatlabで同じ基本的な前処理をどのように達成するのか分かりません。

+0

あなたはこれを見ましたか? http://stackoverflow.com/questions/4521593/fast-technique-for-normalizing-a-matrix-in-matlab – Gopala

答えて

1

これを実行する関数は1つではありませんが、stdmeanには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)) 

説明

meandimパラメータを用いて、我々はAの各列の平均値を計算することができます。

M = mean(A, 1) 

その後、我々は、各列(@minus)の各値から平均値を減算するbsxfunを使用することができます。 M1 x nColsAnRows 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(行)に切り替えます。

+0

Ocatve/Matlabで全く新しい...あなたはとても親切で、 '@'ありますか? – Toni

+0

@AntoniParellada今説明を追加する。 – Suever

+0

@AntoniParellada標準偏差で除算または乗算しますか? – Suever

4

Octaveには、このcenter()とzscore()の2つの関数があります。 zscoreはまた、その平均値を減算することにより、SD(標準化として知られているように時々知られる操作)

中心(X)

センターデータで除算に対し、中心がちょうど、平均値を減算します。

xがベクトルの場合、その平均を減算します。 xが行列の場合は、それぞれ 列に対して上記を実行します。オプションの引数dimが指定されている場合は、この 次元に沿って操作します。

zscore(X、オプトイン、dim)は、xがベクトルである場合、その標準偏差で、その平均値と除算を減算X

のZスコアを計算します。 標準偏差がゼロの場合は、代わりに1で割ります。

オプションのパラメータoptは、 が標準偏差を計算し、 対応するstdのパラメータと同じ定義を持つ場合に使用する正規化を決定します。

xが行列の場合、最初の非シングルトン次元に沿って計算します。 3番目の省略可能な引数dimが指定されている場合は、この ディメンションに沿って操作します。