Python で正規化

  • Pandas
  • Matplotlib
  • Numpy
  • 正規化をやってみよう

    以前の記事「Pythonで標準化」の続きのような感じですが、Pythonで正規化をやってみます。

    まずは、必要なモジュールを読み込んでデータを用意しましょう。

    import numpy as np import pandas as pd import matplotlib.pyplot as plt a = np.random.randint(0,100,100) a = pd.Series(a,name="a_score") b = np.random.randint(100000,1000000,100) b = pd.Series(b,name="b_score") df = pd.concat([a,b], axis=1) print(df) # a_score b_score # 0 8 483168 # 1 33 162257 # 2 64 253630 # 3 35 280976 df.plot(x="a_score",y="b_score",kind='scatter') # 散布図で表示

    nomalization-01

    正規化の数式

    それでは、正規化の数式を見てみましょう。

    $$x' = \frac{x - \min{\left( x \right)}}{\max{\left( x \right)} - \min{\left( x \right)}}$$

    数式そのものは、そこまで難しくないですね。最大値と最小値を使って簡単に表現できます。

    実際に計算してみましょう。

    df_min = df.min() print(df_min) # a_score 0 # b_score 110498 df_max = df.max() print(df_max) # a_score 99 # b_score 987037 df_nomal = (df - df_min) / (df_max - df_min) print(df_nomal) # a_score b_score # 0 0.080808 0.425161 # 1 0.333333 0.059049 # 2 0.646465 0.163292 # 3 0.353535 0.194490 df_nomal.plot(x="a_score",y="b_score",kind='scatter') # 散布図で表示

    nomalization-02

    検算してみる

    "a_score" の index=1 の 0.333333 が正しいか検算します。

    $$\frac{x - \min{\left( x \right)}}{\max{\left( x \right)} - \min{\left( x \right)}} = \frac{33 - 0}{99 - 0} = \frac{33}{99} = 0.333333...$$

    "b_score" の index=2 の 0.163292 が正しいか検算します。

    $$\frac{x - \min{\left( x \right)}}{\max{\left( x \right)} - \min{\left( x \right)}} = \frac{253630 - 110498}{987037 - 110498} = \frac{143132}{876539} = 0.163292...$$

    当たり前の結果ですが、計算結果は正しかったですね。

    何となくわかった気がする

    ここまでやってみて、何となくわかったような気がしています。

    正規化は0~1に数字を置き換える。散布図で見ると、点の位置が変わっているわけではない。

    標準化は標準偏差が1になる。散布図で見ると、平均値を0として、距離で点が表現されるため、位置が変わる。

  • Pandas
  • Matplotlib
  • Numpy