LoginSignup
1
0

More than 3 years have passed since last update.

Matlabのzscore()をpythonで

Posted at

スケーリングといえばやっぱり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より便利なやつがある、と。
これはまた、気が向いたら書くかも。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0