連載
» 2021年04月21日 05時00分 公開

統計学や機械学習でもよく使われる相関係数が分かるベクトル計算の基礎知識「AI」エンジニアになるための「基礎数学」再入門(12)

AIに欠かせない数学を、プログラミング言語Pythonを使って高校生の学習範囲から学び直す連載。今回は「ベクトル」の計算と、その応用、相関係数について、図版とPythonコードを交えて解説します。

[西村圭介,東京ITスクール]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 AIに欠かせない数学を、プログラミング言語Pythonを使って高校生の学習範囲から学び直す本連載『「AI」エンジニアになるための「基礎数学」再入門』。前回は「スカラ」「ベクトル」「行列」「テンソル」の基礎知識を学びました。今回のテーマは、ベクトルの扱い方=計算方法です。

 ところで、皆さんは英語を学習したことがあると思います。新たな英単語・英文法を学ぶことで、より多くの英文を読解できるようになることを経験しているはずです。何が言いたいかというと、今回のテーマを学ぶことは、数学に関連する文献を読むことにおける「単語や文法を学ぶ」ようなことに値します。つまり、より多くの文献を読解できるようになるはずなので、しっかり学んでいきましょう。

2次元のベクトル

 ベクトルの計算方法を解説するために、例として次のような2つのベクトルを考えます。

 今回は2次元(要素が2つ)のベクトルで、次のような数字の集まりとします。

ベクトルa(オレンジ色)、ベクトルb(青色)の図

 Pythonのリストで表現すると、次のような具合です。

vec_a = [1, 3**0.5]
vec_b = [2*3**0.5, 2]
 
vec_a, vec_b
# ([1, 1.7320508075688772], [3.4641016151377544, 2])

 今後の説明は上記のベクトルを使用します。

長さの計算

ポイント

  • 長さは三平方の定理で算出
  • 掛け算でも使用する必須内容

 ベクトルには長さという概念があります。

 長さを表す記号は|<ベクトル>|です。先ほどのベクトルaの長さの場合、下記のように書きます。

 計算方法は三平方の定理を用いて考えると分かりやすいでしょう。

三平方の定理(ただし直角三角形のみにおいて)

斜辺2=底辺2+高さ2


 従って、各ベクトルの長さは次の通りです。

 Pythonコードで結果を確認してみます。

# numpyならば np.linalg.norm で計算できる
def get_length(vec):
    sq = [e**2 for e in vec]
    return sum(sq)**0.5
 
get_length(vec_a), get_length(vec_b)
# (2.0, 4.0)

 なお、長さの概念は、この後の掛け算部分に関連するので押さえておきましょう。

足し算

ポイント

  • ベクトルの合成
  • 計算は対応する位置の要素(スカラ)を足し合わせるだけ

 足し算について、まずはイメージを捉えていきましょう。足し算はベクトルの合成を表します。

 どのように合成をするかというと、次のような手順です。

  1. 一方のベクトルを描く
  2. もう一方のベクトルを、1.のベクトルの先を起点に描く
  3. 原点から2.のベクトルの指すベクトルを描く

 3.で描かれたベクトルが「合成されたベクトル」です。

 イメージがつかめたら計算方法を確認してみましょう。計算方法は簡単で、対応する要素同士で足し算をするだけです。Pythonで確認してみましょう。

def add_vec(vec1, vec2):
    return [e1+e2 for e1,e2 in zip(vec1, vec2)]
 
add_vec(vec_a, vec_b)
# [4.464101615137754, 3.732050807568877]

引き算

ポイント

  • ベクトルの先と先をつなぐ
  • 引き算も足し算と同様に計算できる

 さて、一方で引き算のイメージは簡単です。

 引き算のベクトルは次のような手順で描けます。

  1. 引く側のベクトルの先から、引かれる側のベクトルの先まで矢印を伸ばす
  2. 1.の矢印を、矢印の矢尻が原点に合うようにスライドさせる

 2.(図の【2】)の矢印が引き算後のベクトルです。

 計算方法は足し算と同様です。次のように考えましょう。

 足し算と同様に計算できます。こちらも、Pythonで確認してみましょう。

vec_a = [1, 3**0.5]
vec_b = [2*3**0.5, 2]
 
def subt_vec(vec1, vec2):
    return [e1-e2 for e1,e2 in zip(vec1, vec2)]
 
subt_vec(vec_a, vec_b)
# [-2.4641016151377544, -0.2679491924311228]

掛け算

 ベクトルの掛け算には、内積、外積の2種類があります。それぞれ計算結果の表す意味が異なるので確認していきましょう。

 なお、掛け算と割り算は表裏一体のように思えるものの、実はベクトルに関しての割り算は定義されていません。よって、今回は掛け算のみ解説します。

内積

ポイント

  • ベクトル間の角度を算出するための計算法
  • 計算は対応する要素の掛け算をして合計するだけ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。