AIに欠かせない数学を、プログラミング言語Pythonを使って高校生の学習範囲から学び直す連載。今回は「スカラ」「ベクトル」「行列」「テンソル」について、数式を使わずに図版とPythonコードで解説します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
AIに欠かせない数学を、プログラミング言語Pythonを使って高校生の学習範囲から学び直す本連載『「AI」エンジニアになるための「基礎数学」再入門』。前回は「ベイズの定理」を学びました。今回のテーマ「スカラ」「ベクトル」「行列」「テンソル」は、数学でよく出てくる用語であり、AI(人工知能)が行う計算でもたびたび使われます。「ベクトルやテンソルとは何か」を数式を使わずに説明します。
まずは、スカラやベクトル、行列が何を意味しているのかを説明します。特に難しいことはありません。これらは単にデータの集まりの呼称です。構造によって、データの集まりがベクトル、行列といった呼び方に変わるだけです。これらの呼称でデータのまとまりを簡潔に表すことで、複数の値や変数でも、AIが計算で使わずに数式を簡潔に表現できます。またAIでも使われている数学では、データの集まりをこのように呼ぶことが多いので、ぜひ慣れてください。データの集まりの呼称がどのようなルールに従って変わるのか、順を追って説明します。
スカラ(scalar)は、「1」「-3」「5.7」といった、データが1つの値であるときの呼称です。単なる数値をスカラと呼ぶときは、複数の数値で構成されるベクトルや行列と区別するのに使われ、「気温27℃」や「質量36kg」などの単一の数値で表されるものは全てスカラです。
下記はPythonでスカラを表したコードです。
a = 1 b = -3 c = 5.7 temperature = 27 mass = 36
ベクトル(vector)と聞くと、「高校で学習した平面上の矢印」をイメージする方が多いと思います。矢印のベクトルは、主に物理学で使われており、「大きさと向き」といった2つの要素を持つ「物理量」として定義されています。一方、AIでも使われている、数学におけるベクトルは「ひとまとまりの数字を縦か横に並べたものの呼称」と理解して問題ありません。スカラとの違いは「複数の数値で構成できること」です。スカラは単一の数値なので、ベクトルは「スカラを一方向に並べたもの」といえます。
例えば「田中」「佐藤」「山田」の3人の年齢をそれぞれ個別に表すと、それらはスカラですが、各年齢を1つの集まりとして表現する場合、その年齢データという共有の要素の集まりはベクトルになります。
Pythonでベクトルを表すには多くの場合、「NumPy」を使います。下記は、そのコードです。
import numpy as np # それぞれの年齢はスカラ Tanaka = 27 Satou = 33 Yamada = 42 # 年齢をまとめたベクトル Age_vector = np.array([27,33,42])
ベクトルの利点は「複数のデータに対する計算処理が可能」なことです。スカラで3人の年齢の平均値を計算する場合、下記のように記述する必要があります。
# スカラでの計算 (Tanaka + Satou + Yamada ) / 3
ベクトルを使うと、Pythonでは下記のように簡単に計算できます。
# ベクトルでの計算 np.mean(Age_vector)
例として3人の場合を考えましたが、これが100人、1000人となった場合でも上記のコードで簡単に算出できるのが、ベクトルのメリットです。Pythonでは、ベクトルを「1次元の配列」と呼びます。「1次元」とは、スカラが一方向に並べられていることに起因します。この名付け方に倣うと、スカラは「0次元の配列」です。
また、スカラを一方向に並べたものがベクトルですが、並べる方向が横の場合は「行ベクトル」、縦の場合は「列ベクトル」と呼びます。先ほど例示したベクトルは明示的に両者を区別しませんでしたが、Pythonでは下記のように記述することで両ベクトルを表せます。
# 行ベクトル row_vector = np.array([[1, 2, 3]]) # 列ベクトル col_vector = np.array([[1, 2, 3]]).T # 行ベクトルを表示 print(row_vector) [[1 2 3]] # 列ベクトルを表示 print(col_vector) [[1] [2] [3]]
スカラを一方向に並べたものがベクトルなら、スカラを縦横2方向に並べたものが行列です。また縦ベクトルを横方向に、または横ベクトルを縦方向に並べたものなので、行列はある共有の成分でそろえた一覧表です。
例として下図を見てください。
この行列は身体測定の結果を、IDはそれぞれ個別の人を表しています。この行列を列で見ると、「ID」「年齢」「身長」「体重」といった共有の要素ごと、つまり列ベクトルに分解できます。このIDや年齢、身長、体重の列ベクトルを横につなげたものが行列といえます。このとき、「100次元のベクトルが4つである」ことから「100×4の行列」と呼びます。行列を呼ぶ際は、行→列の順にその要素数を数えると覚えておいてください。
また行方向に別の見方をすると、別の要因で分解できます。IDごとに行で分解すると、測定した人ごとのデータのまとまりになります。これは個人ごとの測定結果ベクトルであり、この行ベクトルを縦につなげたものが行列ともいえます。この場合でも、行数は100で列数が4なので「100×4の行列」となります。
Pythonで行列を定義するときは下記のように記述します。
matrix = np.array([[1, 2, 3], [4, 5, 6] ,[7, 8, 9]]) # matrixを表示 print(matrix) [[1 2 3] [4 5 6] [7 8 9]]
上記コードでは行数3、列数3の「3×3の行列」を定義しています。Pythonで行列は「2次元の配列」のことです。「2次元」とはスカラが縦横の2方向に並べて定義されることに起因しています。
ここまでで、スカラやベクトル、行列は「特定のルールに従って定義されているデータの集まりの呼称」と理解できたと思います。ベクトルが1次元(1方向)、行列が2次元(2方向)に並べられたデータのまとまりとするなら、3次元、4次元などに拡張できることが考えられるでしょう。このような高次元データの集まりがテンソルです。厳密には、テンソルには「データの集まり」以上の定義がありますが、AIで使う数学の知識に限定するなら、ここで説明する範囲の理解で問題ありません。
またテンソルは、3次元以上の配列に限定するものではありません。スカラやベクトル、行列などもテンソル表記で表せます。テンソルの理解で重要なことは次元が増えるごとにデータが持つ特徴量(情報量)が増えている点です。AIで複雑な計算をするには、インプットとしてAIに与えるデータもより多くの情報を必要とします。つまり、AIの種類によってインプットとするテンソルデータが異なり、目的に応じてデータの構造を変える必要があるのです。
次元数 | 名称 | テンソル表記 |
---|---|---|
0 | スカラ(0次元の配列) | 0階のテンソル |
1 | ベクトル(1次元の配列) | 1階のテンソル |
2 | 行列(2次元の配列) | 2階のテンソル |
3 | 3次元の配列 | 3階のテンソル |
4 | 4次元の配列 | 4階のテンソル |
…… | …… | …… |
n | n次元の配列 | n階のテンソル |
ベクトルや行列などは直感的に理解できると思いますが、3次元配列や4次元配列であるテンソルがどのようなものか理解するのは難しいかもしれません。もっと具体的に説明します。
9〜20時で営業している果物屋の5日分の販売データを例にします。1日当たり9〜20時の計12時間分の列数で3つの果物ごとに販売数が存在するとしましょう。ある特定の日に限定すると、その日の販売データの集まりは「12×4の行列」になります。この行列データを5日分集めることで、3階のテンソルとして表せます。このときのデータ形状は「(5,12,4)」といった順で表します。
Copyright © ITmedia, Inc. All Rights Reserved.