kentaPtの日記

主に画像解析のことなどの勉強記録として投稿します。もし何かございましたら、github (https://github.com/KentaItakura)などからご連絡いただけると幸いです。

MATLABのNormalize関数で使った平均と標準偏差を保持して、未知データに対しても同じ演算をする+もとのスケールに戻す

データ分析において、対象のデータをスケーリングしたい場合、例えば、平均0・分散1になるよう変換する場合が多いと思います(標準化)。MATLABでは、normalize関数を用いれば1行で済むため、非常に便利です。しかし、同様の式を用いて、別のデータも標準化したいときがあります。または、標準化したものをもう一度もとのスケールに直したい、といったこともあります。その場合は、normalize関数の戻り値に、その標準化に用いた平均値・標準偏差を指定することで、そのような追加の変換や、もとのスケールへの再変換が簡単に行えます。

公式ドキュメントは以下の通りです。

jp.mathworks.com

はじめに、normalize関数は、

N = (A - C) ./ S を満たす CS を配列として返します。

とあります。Cが平均、Sが標準偏差であると思われます。methodtypeで指定できる、標準化の方法が複数ありますが、今回は、既定であるz-scoreとします。

整数を30個生成してみます。

data=randi(100,[30,1]);%100までの整数を30個生成する

これをnormalize関数を用いて標準化します。ここでは、後ろ2つの戻り値を指定することがポイントです。先頭の1つしか指定しない場合が多い気がしますが、このように3つ指定すると便利です。。

[N,average,stdev]=normalize(data); % 戻り値にaverage, standard deviationを指定できる

標準化したあとの値を見てみます

N
N = 30x1    
   -1.0634
    1.7534
   -1.3910
    1.1311
    1.2621
    1.4259
   -1.1289
   -0.1135
   -0.5721
    1.2294

検算のため、平均を引いて、標準偏差で割れば同じ値になることを確認します。

N_check=(data-average)/stdev
N_check = 30x1    
   -1.0634
    1.7534
   -1.3910
    1.1311
    1.2621
    1.4259
   -1.1289
   -0.1135
   -0.5721
    1.2294

逆に、標準化したあとに、もとのスケールに戻すことを行います。

data_check=N*stdev+average
data_check = 30x1    
    11
    97
     1
    78
    82
    87
     9
    40
    26
    81

もとのデータと一致していることを確かめます。

data
data = 30x1    
    11
    97
     1
    78
    82
    87
     9
    40
    26
    81

以上、normalize関数を用いるときに、別のデータも標準化する方法、そして、標準化したものをもう一度もとのスケールに戻す方法を簡単にまとめました。