LoginSignup
5
6

More than 5 years have passed since last update.

ベクトルを任意の範囲に標準化する

Last updated at Posted at 2017-05-15

 適当なベクトル $v$ を、範囲 $[0, 1]$ や $[-1, 1]$ に標準化する機会は多いですね。
今、$v$ を以下のようにランダムな数値を持つベクトルとして作ります。

random_vector.py

import random
random.seed(1)
v = [random.random() for _ in range(10)]

 上のpythonコードで、$v$ は例えば以下のように与えられます。

figure_1.png

 このベクトルを範囲$[0,1],[-1,1]$に標準化するには、それぞれこうします。

  • $[0,1]$へ標準化

\frac{v - min(v)}{max(v) - min(v)}

  • $[-1,1]$ へ標準化

\frac{2v - (max(v) + min(v))}{max(v)-min(v)}

 これにより、$v$ は線形に標準化されます。

figure_2.png

 ただ、ベクトルを任意の範囲 [newmin, newmax] に標準化したいときってありますね。

 そんなときには、まず2つの定数 $a, b$ を計算します。


a = (newmax - newmin)/(max(v) - min(v)) \\
b = newmax - a*max(v)

 このとき、$b = newmin - a*min(v)$でも同じです。

 最後に、$a$ が傾き、$b$ が切片となる一次関数を作り、元のベクトル$v$ を代入すれば、線形に標準化された新しいベクトルが出てきます。


normalized\ vector = a*v + b

 これが、ベクトルを線形に標準化するときの一般形です。

 Python、 Matlabでベクトル $v$ を範囲 [newmin, newmax] に標準化するコードを載せておきます。


Python

normalize.py

def normalize(v,newmin,newmax):
    a = (newmax - newmin)/(max(v) - min(v))
    b = newmax - a*max(v)

    return [a*i + b for i in v]


Matlab

normalize.m

function [normalized_vector] = normalize(v, newmin, newmax)

a = (newmax - newmin)/(max(v) - min(v));
b = newmax - max(v)*a;

normalized_vector = a*v + b;


5
6
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
5
6