[E資格] 文系でもわかる!線形代数の歴史とAIとの意外な関係

【第1回:起源編】

新人エンジニアのみなさん、こんにちは!

AIや機械学習の勉強を始めると、必ずと言っていいほど「線形代数」という壁にぶつかりますよね。

「行列? ベクトル? 高校の時にやった気もするけど、AIとなんの関係があるの?」

そう感じるのも無理はありません。でも、実は線形代数は、特定の天才が突然ひらめいたものではなく、人類が数千年かけて「面倒な計算を楽にするため」作り上げてきた道具なんです。

今回は全3回にわたって、線形代数の歴史を紐解きながら、E資格のシラバス(出題範囲)にある線形代数の基礎を、Pythonコードを交えて解説していきます。歴史を知れば、数式がただの記号ではなく、意味のある「言葉」に見えてきますよ。

1. 全ては「買い物の計算」から始まった

まずは、時計の針を紀元前まで戻してみましょう。線形代数のルーツ、それは「連立方程式」です。

古代中国の数学書『九章算術』には、既に現代の行列計算に近い考え方が記されていました。当時はAIのためではなく、税金の計算や土地の測量といった、生活に直結する問題を解くために使われていたのです。

例えば、こんな状況を想像してください。

  • リンゴを2個、ミカンを1個買ったら、合計で400円でした。
  • リンゴを1個、ミカンを3個買ったら、合計で450円でした。

これを数式にすると、中学生で習った連立方程式になりますね。

2x + 1y = 400

1x + 3y = 450

ここで重要なのは、この計算が「複数の条件を同時に満たす答えを探す」作業だということです。

実はAIの学習も、これと非常によく似ています。AIは、何万、何億という膨大なデータ(条件)を読み込み、それら全ての辻褄が合うような「最適なパラメータ(答え)」を探しているのです。

つまり、線形代数とは「大量の連立方程式を、効率よく解くための技術」と言い換えることができます。そう考えると、少し親近感が湧いてきませんか?

2. デカルトの革命:数字を「空間」に置く

次に時代は飛んで17世紀。フランスの哲学者であり数学者のルネ・デカルトが登場します。彼の最大の功績の一つは、「座標」を発明したことです。

それまでの幾何学(図形の問題)と代数学(数式の問題)は、別の学問でした。しかしデカルトは、「空間上の点は、数字のペア(x, y)で表せる」ことに気づきました。

これがなぜAIにとって重要なのでしょうか?

AIの世界では、画像や音声、言葉など、あらゆるものを「数字の羅列(ベクトル)」に変換して扱います。

例えば、縦100ピクセル、横100ピクセルの画像データがあったとします。これはコンピュータにとっては、1万個の数字が並んだデータに過ぎません。

しかし、デカルトの考え方を使えば、この画像データは「1万次元の空間にある、たった1つの点」として捉えることができます。

  • 似ている画像同士は、空間の中で距離が近い。
  • 全く違う画像は、空間の中で距離が遠い。

このように、データを「空間上の点(ベクトル)」として扱うことで、AIは「似ている」「似ていない」を数学的に計算できるようになるのです。距離計算という概念も、この座標の考え方がベースになっています。

3. Pythonで「ベクトル」を作ってみよう

さて、歴史の話ばかりでは退屈してしまいますよね。ここで少し、エンジニアらしくコードを書いてみましょう。

AI開発で標準的に使われるライブラリ NumPy を使って、データを「ベクトル(数値の列)」として表現してみます。

Pythonには標準の list がありますが、AI開発では計算速度や機能の面から NumPy の配列(ndarray)を使うのがお作法です。

import numpy as np

# リンゴとミカンの価格(これを1つのベクトルとみなす)
# [リンゴの価格, ミカンの価格]
prices = np.array([150, 100])

print("価格ベクトル:")
print(prices)

# 買い物かごの中身(個数)
# [リンゴの個数, ミカンの個数]
basket_a = np.array([2, 1])
basket_b = np.array([1, 3])

print("\n買い物かごA:")
print(basket_a)

このように np.array を使うことで、複数の数字をひとまとまりの「ベクトル」として扱えます。

ここでのメリットは、計算が直感的になることです。

例えば、「買い物かごA」の合計金額を出したい時、普通のプログラミングなら for 文を使って一つずつ掛け算して足し合わせますよね?

でも、線形代数の考え方(ベクトルの内積)を使えば、一瞬で計算できます。

Python

# 合計金額の計算(内積)
total_a = np.dot(prices, basket_a)

print(f"\n買い物かごAの合計金額: {total_a}円")

この np.dot という操作こそが、線形代数の基本中の基本であり、AIのニューラルネットワークの中で何億回と繰り返されている計算の正体です。行列・テンソルの積や勾配計算の基礎となります。

4. 今日のまとめ

今回は、線形代数の歴史のスタート地点である「連立方程式」と「座標」についてお話ししました。

  • 起源: 複数の条件を解く「連立方程式」がルーツ。
  • 座標の発見: デカルトのおかげで、データを「空間上の点」として扱えるようになった。
  • Python: NumPy を使えば、データのまとまり(ベクトル)を簡単に計算できる。

私たちが扱っているデータは、単なる数字の羅列ではありません。それは空間の中に浮かぶ「点」であり、その点同士の関係性を探ることがAI開発の第一歩なのです。

次回の予告

次回は、いよいよ「行列」が本格的に登場します。

ガウスという天才が整理した計算手法が、どのようにして現代のAIの高速処理に繋がっているのか? そして、行列を使えばデータを自由自在に変形できる理由とは?

行列演算の核心に迫る第2回、どうぞお楽しみに!

【第2回:行列編】

前回は、データを「空間上の点(ベクトル)」として捉えるデカルトの革命についてお話ししました。

しかし、AIが扱うデータは、1つや2つではありません。何千、何万というデータを一度に扱わなければならないのです。

そこで登場するのが、今回のテーマである「行列」です。

「行列って、数字が四角く並んでいるあれでしょ?計算が面倒くさそう…」

そう思ったあなた。実はその直感、歴史的にも正しいのです。かつての数学者たちも、面倒な計算をなんとか楽にしようと必死でした。その結果生まれたのが、現代のAIを支える最強の武器「行列」なのです。

今回は、その歴史的な背景と、Pythonを使った行列計算の威力を体験してみましょう。

1. ガウスの悩み:連立方程式を解くのが大変すぎる

19世紀前半、「数学の王」と呼ばれたカール・フリードリヒ・ガウスが登場します。彼は天文学の観測データなど、複雑な計算と格闘していました。

前回のリンゴとミカンの例を思い出してください。あれは変数が2つ(リンゴとミカン)だけでした。しかし、もしこれが「リンゴ、ミカン、ブドウ、バナナ…」と10種類あったらどうでしょう?式も10本必要になり、これを手計算で解くのは悪夢です。

ガウス(正確にはその前の時代からの積み重ねですが)は、こう考えました。

「式の中にある x や y といった文字を書くのが面倒だ。数字だけをきれいに並べて計算すればいいんじゃないか?」

これが「行列」の原型です。

つまり、行列とは「数字を表(テーブル)のように並べて整理したもの」です。皆さんが普段使っているExcelのスプレッドシートをイメージしてください。あれこそが、まさに巨大な行列そのものです。

AIにとって行列が重要な理由の1つ目はここにあります。

「大量のデータを、一つの表(行列)としてまとめて管理できる」からです。

2. ケーリーの発見:行列は「数」のように計算できる

ガウスの時代、行列はまだ「連立方程式を解くための便利な書き方」に過ぎませんでした。

これを一変させたのが、19世紀半ばのアーサー・ケーリーです。

彼は驚くべき発見をします。

「この四角く並んだ数字の塊(行列)は、普通の数字と同じように足したり、引いたり、掛けたりできるぞ!」

これが何を意味するか、少し想像してみましょう。

もし行列計算がなかったら、AIのプログラムは for 文(繰り返し処理)だらけになります。

「データ1を計算して、次はデータ2を計算して…」と、1万人のデータがあれば1万回の繰り返し処理を書かなければなりません。

しかし、ケーリーが体系化した「行列の積」などのルールを使えば、1万人のデータを「ひとつの行列 A 」として扱い、たった1行の式で全員分の計算を一気に終わらせることができるのです。

これこそが、AIが行列を使う最大の理由。「超高速な一括処理(バッチ処理)」です。

3. Pythonで「行列計算」の魔法をかける

それでは、この「一括処理」の凄さをPythonで体験してみましょう。

前回は、1つの買い物かごの計算をしました。今回は、Aさん、Bさん、Cさんという3人分の買い物かごを一度に計算してみます。

まずは、NumPyを使って行列を作ります。

import numpy as np

# リンゴとミカンの単価ベクトル
# [リンゴ150円, ミカン100円]
prices = np.array([150, 100])

# 3人の買い物かご(これが行列!)
# 行が人、列が商品を表します
# Aさん: リンゴ2, ミカン1
# Bさん: リンゴ1, ミカン3
# Cさん: リンゴ5, ミカン0
baskets = np.array([
    [2, 1],
    [1, 3],
    [5, 0]
])

print("買い物かご行列(3人分):")
print(baskets)

この baskets という変数は、3行2列の行列です。

ここからが魔法の瞬間です。3人分の合計金額を出すために、for文を回す必要はありません。行列とベクトルを掛け合わせる(ドット積をとる)だけです。

# 行列(baskets)とベクトル(prices)の積を計算
totals = np.dot(baskets, prices)

print(f"\n3人分の合計金額を一括計算: {totals}")

実行結果を見ると、 [400 450 750] のように、3人分の答えが一瞬で表示されるはずです。

これがAIの内部で起きていることです。

Deep Learning(深層学習)では、画像データなどを巨大な行列に変換し、重みと呼ばれる別の行列と掛け合わせることで、何百万枚もの画像を一気に学習・判定しているのです。

この計算のことを、E資格のシラバスでは「行列・テンソルの積」というキーワードで呼んでいます(テンソルは、行列をさらに多次元に拡張した概念だと今は思ってください)。

4. 行列はデータを「変換」する装置

行列にはもう一つ、非常に重要な役割があります。それは「線形変換」です。

先ほどの計算を別の視点で見てみましょう。

「リンゴとミカンの個数」というデータを入力したら、「合計金額」という別のデータに変換されて出力されましたね。

  • 入力:個数の世界(2次元)
  • 処理:行列による掛け算
  • 出力:金額の世界(1次元や別の次元)

このように、行列は「あるデータを、別の意味を持つデータに変換する装置」として働きます。

画像認識AIが、入力された「ピクセル(点)の集まり」を、「猫である確率」というデータに変換できるのも、内部で何層もの行列計算(変換)を行っているからなのです。

5. 今日のまとめ

今回は、計算革命の歴史と行列の役割について解説しました。

  • ガウスの整理: 複雑な連立方程式を、数字の表(行列)に整理した。
  • ケーリーの定義: 行列そのものを計算対象とし、一括計算のルールを作った。
  • AIとの関係: 行列を使えば、大量のデータをfor文なしで一気に処理・変換できる。

行列は、単なる数字の羅列ではありません。データを効率よく運び、加工するための「ベルトコンベア」のようなものだとイメージしてください。

次回の予告

さて、ここまでで「データを並べる(ベクトル)」「一気に計算する(行列)」ことができるようになりました。

しかし、AI開発では「データのどこが重要なのか?」を見抜く力が必要です。

次回、最終回は「固有値と固有ベクトル」。

名前を聞くだけで難しそうですが、実はこれ、データの「特徴」を抽出するための鍵なのです。100年前の抽象数学が、現代のデータ分析にどう繋がるのか?

データの本質に迫る第3回、お楽しみに!

【第3回:抽象化編】

E資格インストラクターです。ついに最終回となる第3回です!

第1回ではデータを「空間の点(ベクトル)」とし、第2回ではそれを一気に操る「行列」について学びました。

ここまで来れば、単なる計算はコンピュータに任せることができます。

しかし、AIエンジニアには計算以上のことが求められます。それは、「大量のデータの中から、何が重要なのかを見抜くこと」です。

「データの特徴をつかむ」

口で言うのは簡単ですが、数学的にはどうやるのでしょうか?

ここで登場するのが、20世紀に完成された抽象線形代数の概念、「固有値」と「固有ベクトル」です。

名前がいかめしいので身構えてしまうかもしれませんが、大丈夫です。これは言い換えれば、データの「背骨」を見つけるための道具なのです。

1. 20世紀の転換:計算から「構造」の理解へ

19世紀まで、数学者たちは方程式を「解く」ことに必死でした。しかし20世紀に入ると、ダフィット・ヒルベルトらによって、数学はより抽象的な「空間の構造」を研究する学問へと進化しました。

彼らはこう考えました。

「個々の数字を細かく見るのではなく、空間全体がどう歪んでいるか、その『クセ』を見抜けば、本質がわかるのではないか?」

これをAIの現場に置き換えてみましょう。

例えば、身長と体重のデータが1万件あるとします。個々のデータ(Aさんは170cm、Bさんは160cm...)を見るだけでは、全体像はわかりません。

しかし、データをグラフにプロットすると、なんとなく「右上がりの楕円形」に分布していることが多いはずです。

この「データがどちらに向かって伸びているか(分布の向き)」こそが、そのデータセットの「構造」であり「特徴」です。これを見つける手法が、今回学ぶテーマです。

2. 固有値・固有ベクトルって何?

ここで、少しだけ数式を出しますが、怖がらないでくださいね。

ある行列 A (変換装置)を、あるベクトル x に掛け算したとき、不思議なことが起きるケースがあります。

Ax = \lambda x

通常、行列を掛けるとベクトルは回転したり向きが変わったりします。

しかし、稀に「向きが変わらず、長さだけが \lambda (ラムダ)倍になる」特別なベクトルが存在します。

  • 固有ベクトル( x ): 変換しても向きが変わらない、その変換の「軸」となるベクトル。
  • 固有値( \lambda ): その軸方向にどれだけ伸び縮みするかを表す「倍率」。

わかりやすい例え:ラグビーボール

丸い風船に点を描いて、それをグニューっと引っ張ってラグビーボールのような形に歪める変換を想像してください。

ほとんどの点は位置がずれますが、「引っ張った方向(先端と先端を結ぶ軸)」にある点だけは、一直線上に留まっていますよね?

この「引っ張った軸」が固有ベクトルで、「どれくらい長く伸びたか」が固有値です。

AI(特に画像処理やデータ分析)において、固有値分解や特異値分解(SVD)は次のように使われます。

  • 固有ベクトル: データが一番散らばっている方向(=データの特徴が最もよく表れている「主成分」)を示す。
  • 固有値: その特徴がどれくらい重要か(情報の大きさ)を示す。

つまり、固有値を調べることで、AIは「この画像のどの部分が重要で、どの部分はノイズ(無視していい情報)なのか」を数学的に判断しているのです。

3. Pythonでデータの「軸」を見つけてみよう

それでは、Pythonの NumPy ライブラリにある linalg (線形代数モジュール)を使って、実際に固有値と固有ベクトルを求めてみましょう。

ここでは、「横方向に2倍、縦方向に3倍」に引き伸ばす単純な行列を例にします。

import numpy as np

# 変換行列 A
# [[2, 0],
#  [0, 3]]
# これはx座標を2倍、y座標を3倍にする変換です
A = np.array([
    [2, 0],
    [0, 3]
])

# 固有値と固有ベクトルを計算
# linalg.eig という関数一発で求まります
eigenvalues, eigenvectors = np.linalg.eig(A)

print("固有値 (重要度):")
print(eigenvalues)

print("\n固有ベクトル (軸の向き):")
print(eigenvectors)

実行すると、固有値として [2. 3.] が表示されるはずです。

これは、「ある軸方向にはデータが2倍に伸び、別の軸方向には3倍に伸びている」ことを示しています。AIにとっては「3倍に伸びている方向(固有値3の方向)の方が、データの変化が大きくて重要だな!」と判断する材料になります。

この技術を応用したのが、E資格のシラバスにある「主成分分析(PCA)」や「特異値分解(SVD)」です。

これらは、何千次元もある複雑なデータから、固有値の大きい(重要な)軸だけを残して、データを圧縮したりノイズを除去したりするために使われます。

いわば、「情報のお片付け術」ですね。

4. 全3回のまとめと、これからの学習指針

お疲れ様でした!3回にわたって、線形代数の歴史とAIとの関係を駆け足で見てきました。

  1. 第1回: データは「空間上の点(ベクトル)」である。(デカルトの座標)
  2. 第2回: 行列を使えば、大量のデータを一括で「変換」できる。(ガウスとケーリー)
  3. 第3回: 固有値・固有ベクトルを使えば、データの「重要な軸」を抽出できる。(抽象線形代数)

この3つのステップを理解していれば、E資格の数式を見ても「ああ、これはデータを変換しているんだな」「これは重要な特徴を探しているんだな」と、式のお気持ちが読めるようになっているはずです。

次のステップ:あなたは何をすべき?

線形代数の基礎イメージができたら、次は以下の分野に進んでみてください。これらもE資格の必須範囲です。

  • 微分・積分(解析学): AIが「正解」に向かって学習を進めるために、グラフの傾き(勾配)を求めるのに使います。「誤差逆伝播法」の理解に必須です。
  • 確率・統計: データに含まれる不確実性を扱うために必要です。「ベイズ推定」などがキーワードになります。

数学は、AIと対話するための言語です。

焦らず、歴史背景や意味を考えながら、少しずつ読み解いていってください。応援しています!

あなたへのアクションアイテム

今回のPythonコードの行列 A[[1, 2], [2, 1]] のような斜めの成分がある行列に変えて実行してみてください。固有ベクトルが [0, 1] (真横や真縦)ではなく、斜めの数字になるはずです。それが「斜めに引き伸ばされたデータの軸」です!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。