【NumPy入門】ベクトルの大きさ(ノルム)を計算するnp.linalg.norm

こんにちは!インストラクターのフクロウです!

ニューラルネットワークの過学習対策でもおなじみのL1ノルム、L2ノルムを計算するnp.linalg.norm関数を紹介します!

使い方はとっても簡単!この記事で

  • ノルムって何?
  • np.linalg.normってどう使うの?
  • 機械学習ではどう使われるの?

の三点を押さえて、使いこなしちゃいましょう!

目次

ノルムって何?

(簡単に言うと)原点などからある点までの距離(大きさ)ノルムといいます。

ノルムにはいくつか種類があって、代表的なものとしてはL0ノルム、L1ノルム、L2ノルムなどがあります。

L0ノルム

これは0以外の値を持つ次元の数のことです。

(ちゃんとした定義を知りたい方は以下の資料を見ましょう。)

L1ノルム

これは各次元の値の絶対値の和のことです。

「マンハッタン距離」という距離の考え方と同じ計算式です。

L2ノルム

各次元の値を2乗した和の平方根がL2ノルムです。

「ユークリッド距離(普通の距離のことです)」という距離の考え方と同じ計算式です。

L2ノルムは中学校でも習ったおなじみのものです。

下のグラフの矢印の長さを求めます。

import numpy as np
import matplotlib.pyplot as plt

plt.figure()

# 矢印(ベクトル)の始点
O = np.array([0,0])
# 矢印(ベクトル)の成分
X = np.array([4,3])

# 矢印(ベクトル)
plt.quiver(O[0],O[1],
           X[0],X[1], 
           angles='xy',scale_units='xy',scale=1)

# グラフ表示
plt.xlim([-5,5])
plt.ylim([-5,5])
plt.grid()
plt.draw()

np.linalg.normの使い方

np.linalg.normはノルムを計算する関数です。

引数に配列を渡せば他のNumPy関数同様に計算してくれます。

大事な引数であるordを中心にコードを見てみましょう。

ordはL0, L1, L2などの指定に使うパラメータです。

L0ノルム

Xの中で0でない値は2つなので……

>>> np.linalg.norm(X, ord=0)

2.0

L1ノルム

要素の絶対値の和は7なので……

>>> np.linalg.norm(X,ord=1)

7.0

>>> np.sum(np.abs(X))

7

L2ノルム

三平方の定理を思い出してください。

>>> np.linalg.norm(X, ord=2)

5.0

>>> np.sqrt(np.sum(np.abs(X**2)))

5.0

ノルムって何に使えるの?

ノルムの計算、特にL1ノルムやL2ノルムは、ニューラルネットワークの不要なパラメータを削ったり過学習を防ぐために使われています。

L1正則化、L2正則化などと呼ばれるものです。

結合重みのノルムを計算して、この値を損失関数にペナルティ項として追加することで利用します。

詳しく知りたい方は以下の記事がおすすめです。

まとめ

この記事では、NumPyでノルムを計算する関数「np.linalg.norm」を紹介しました。

機械学習の実装ではL1ノルムやL2ノルムが大活躍しますよ。

使い方も簡単なので、是非使ってみてください!

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次