【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正則化などと呼ばれるものです。

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

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

渋谷駅前で働くデータサイエンティ...
RでL1 / L2正則化を実践する - 渋谷駅前で働くデータサイエンティストのブログ L1 / L2正則化と言えば機械学習まわりでは常識で、どんな本を見てもその数式による表現ぐらいは必ず載ってる*1わけですが、そう言えばあまり実務では真面目にL1 / L2正則化...

まとめ

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

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

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

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次