適当なベクトル $v$ を、範囲 $[0, 1]$ や $[-1, 1]$ に標準化する機会は多いですね。
今、$v$ を以下のようにランダムな数値を持つベクトルとして作ります。
random_vector.py
import random
random.seed(1)
v = [random.random() for _ in range(10)]
上のpythonコードで、$v$ は例えば以下のように与えられます。
このベクトルを範囲$[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$ は線形に標準化されます。
ただ、ベクトルを任意の範囲 [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;