スケーリングといえばやっぱりzスコアが基本でしょ。
基本なだけに、色々とやり方はあるけれど。
matlabのzscore()にはscipy.stats.zscore()がほぼ同じ。
ほかには、scikit-learnでも便利なのがあるらしい。
scipy.stats.zscore()
matlabでXのDim軸方向zscore(X,flag,Dim)で求める。
flagはデフォルトで0で、flag=0のときはn-1で、flag=1のときはnで割ったstdを使う。
同じことは、scipy.stats.zscore(X,axis=Dim-1, ddof=1-flag)でできる
ここでDim-1としてるのは、Pythonではaxisjは0から始まるので、Matlab的な書き方に合わせるとこうなるから。
ddofを1-flagとしているのは、0のときはn、1のときはn-1で割ったstdを使うので、matlabと0、1が反転しているから。
もっとも、ddofは自由度を表しているので、scipyの方が理にかなっているように見える
例:zscore() in Matlab
>> zscore(sin((-1:0.25:1)*pi),0)
ans =
-0.0000 -1.0000 -1.4142 -1.0000 -0.0000 1.0000 1.4142 1.0000 0.0000
例:scipy.stats.zscore() in Python
>>> import numpy as np
>>> from scipy import stats
stats.zscore(np.sin(np.arange(-1,1.1,0.25)*np.pi),ddof=1)
array([-1.92434679e-16, -1.00000000e+00, -1.41421356e+00, -1.00000000e+00,
-1.92434679e-17, 1.00000000e+00, 1.41421356e+00, 1.00000000e+00,
1.53947743e-16])
np.arange(-1,1,0.25)とすると、1が入らないので、範囲を揃えるためにnp.arange(-1,1.1,0.25)としている。
どこで丸めるかという差はあるが、同じ結果。
scikit-learnのpreprocessing.StandardScaler()
zスコアを出すのに使うmean/stdをとってくるデータと、実際にスコアに落とすデータを分けられて、それぞれ1行で書けるという便利なやつがある、らしい。
つまり、Matlabのzscoreより便利なやつがある、と。
これはまた、気が向いたら書くかも。