医療職からデータサイエンティストへ

統計学、機械学習に関する記事をまとめています。

第4回:RとPythonで学ぶデータサイエンス数学~ベクトル基礎~

ベクトルと行列は、データサイエンスの中でも頻出であり、とてもとても便利な概念です。今回からは、今まで学んだ平均や分散、微分、最小二乗法などを使って、ベクトルや行列の概念にふれていきます。

www.medi-08-data-06.work

www.medi-08-data-06.work

www.medi-08-data-06.work

今回の目的は以下になります。

  • ベクトルとは何かを理解する。 - ベクトルを作って、平均値を計算できるようになる。

誰が読んでも理解できることを目指していますので、分かりにくい、理解できない等ありましたら、お気軽にコメント頂けると幸いです。なお、RやPythonを使わなくても、学ぶことができる内容ですので、数学の知識だけ学びたいという方も是非ご覧ください(^^)

ベクトルの基礎

ベクトルとは、ずばり座標で表される矢印ことです。しかし、多くの場合は4次元以上のベクトルになり、想像ができなくなるので、二次元の矢印で考えてみます。

データサイエンス数学

この矢印は、右に3、上に5進んだ矢印で、数学では

 \boldsymbol{x} = \vec{x}=\begin{pmatrix}
3\\
5
\end{pmatrix}

と表します。文字は何でもよいのですが、今回はxとしました。書き方は、文字の上に矢印をつけるか、太文字にするのが一般的です。重要なのは、ベクトルは基本的に数字が縦に並んでいるということです。また、ベクトルは矢印なので、方向の要素をもちます。(意味が分からなくても、何となく頭の隅に置いておいてください。)

ベクトルの長さ

まずは、ベクトルの長さについてです。ベクトルの長さのことをノルムと呼び、文字を二重線で囲って表します。

 ||\vec{x}||= \sqrt{3^{2}+5^{2}}

データサイエンス数学

直感的には三平方の定理から理解することもできます。ベクトルのノルムは、方向の要素を持たないただの数字となり、方向の要素をもつベクトルと対応して、スカラーとも呼びます。スカラーと書いてあったら、ただの数字だと思ってください。

Rではc()で、pythonではnumpy.arrayでベクトルを表します。

# 出力は横向きだが、縦に並んでいることを意識する。
 vector_x <- c(3,5)
 print(vector_x)
[1] 3 5
# ノルム
norumu <- sqrt(sum((vector_x)^2))
print(norumu)
[1] 5.830952
import numpy as np
# 出力は横向きだが、縦に並んでいることを意識する。
vector_x =  np.array([3,5])
print(vector_x)
>[3 5]
# ノルム
norumu = np.sqrt(np.sum((vector_x)**2))
print(norumu)
>5.830951894845301

足し算引き算

お次はベクトルの足し算と引き算です。矢印に2つ目のベクトル\vec{y}を足します。やり方はベクトルの要素ごとに数字を足し合わせるだけです。

\vec{y}=\begin{pmatrix}
2\\
6
\end{pmatrix}
\\\ \vec{x}+\vec{y}=\begin{pmatrix}
3\\
5
\end{pmatrix}+
\begin{pmatrix}
2\\
6
\end{pmatrix}=
\begin{pmatrix}
5\\
11
\end{pmatrix}

足し算の意味を視覚的に表わすとこんな感じになります。

データサイエンス数学

引き算も同様ですね。

\vec{x}-\vec{y}=\begin{pmatrix}
3\\
5
\end{pmatrix}-
\begin{pmatrix}
2\\
6
\end{pmatrix}=
\begin{pmatrix}
1\\
-1
\end{pmatrix}

データサイエンス数学

# 足し算引き算
vector_y <- c(2,6)
tasu <- vector_x + vector_y
print(tasu)
[1]  5 11

hiku <- vector_x - vector_y 
print(hiku)
[1]  1 -1
vector_y = np.array([2,6])
# 足し算引き算
tasu = vector_x + vector_y
print(tasu)
>[ 5 11]
hiku = vector_x - vector_y 
print(hiku)
>[ 1 -1]

ベクトルの定数倍と内積

ベクトルには定数をかける定数倍と、ベクトル同士をかける内積という概念があります。定数倍はとても簡単で、それぞれの要素に定数をかけます。矢印の長さが伸びるイメージですね。

2 \vec{x}=2\times
\begin{pmatrix}
3\\
5
\end{pmatrix}=
\begin{pmatrix}
6\\
10
\end{pmatrix}

データサイエンス数学

一方で、内積とは要素ごとに数字をかけて、それを足し合わせた値です。内積の値はベクトルではなく、ただの数字、つまりスカラーとなります。ここで、ベクトルは基本的に縦で表されると書きましたが、内積をする際には、横×縦にします。ベクトルを縦から横に変換することを転置といってこのように表現します。(おそらく転置は、主に行列に用いる概念ですが、今後の分かりやすさを踏まえて、あえてベクトルの転置と表現しています。)

 \vec{x}^{T}=\begin{pmatrix}
3\\
5
\end{pmatrix}^{T}=
\begin{pmatrix}
3&5
\end{pmatrix}

そして内積は、点で表します。

\vec{x}と\vec{y}の内積:\vec{x} \cdot \vec{y}

ベクトルの内積は、長さが同じで、横×縦の形にする必要があるということをおさえておくと、今後の行列計算にも役に立ちます。やってみましょう。

データサイエンス数学

さて、この内積は何を意味しているのかですが、これは左側のベクトル上に右側のベクトルを影のように写した長さに、左側のベクトルの長さをかけたものです。

データサイエンス数学

これを理解するには三角関数を使う必要があるのですが、私が説明するよりもこちらの記事を読まれるといいです。

【内積とは】ベクトルの内積の意味や公式・計算方法を知って大学合格へ! | Studyplus(スタディプラス)

#転置
 tenchi <- t(vector_x) 
 print(tenchi)
     [,1] [,2]
[1,]    3    5
#定数倍
 teisubai <- 2*vector_x 
 print(teisubai)
[1]  6 10
#内積は %*% を使う。
 naiseki <- t(vector_x) %*% vector_y  
 print(naiseki)
     [,1]
[1,]   36
#転置
tenchi = vector_x.T 
print(tenchi)
>[3 5]
#定数倍
teisubai = 2*vector_x 
print(teisubai)
>[ 6 10]
#内積は np.dotを使う。
naiseki = np.dot(vector_x.T,vector_y)  
print(naiseki)
>36

Advance: 内積を使って

少し応用的な内容ですので、難しい方は読み飛ばしても構いません。この内積の値は、2つの矢印がどれくらい似た方向を向いているのか、とも考えることができます。例えば、長さが1の2つのベクトルを考えます。分かりやすくするために、始点は同じにしておきましょう。

データサイエンス数学

この2本のベクトルを、片方を固定して、もう一方をぐるぐると動かしてみます。

データサイエンス数学

これは、相関係数とも呼ばれ、変数同士の関連性を表した指標です。例えば、相関係数が正の値であれば、一方が増えると、もう片方も増えるという関係にあり、負の値であれば、もう片方は減るという関係性にあることが言えます。(一般的には、変数同士の共分散の視点から説明されることが多いのですが、今回のようにベクトルの内積で、どれくらい方向が似ているのかという観点からも考えることができます。)

これを使うと内積が0になるところは、ベクトル同士が90°になっています。これをベクトルの直交といってこのように表します。

\vec{x}と\vec{y}が直交している:\vec{x} \perp \vec{y}

このベクトルの直交は、非常によく出てくる理論なので覚えておきましょう。

ベクトルを使った平均値

ベクトルの考えをさらに深めるため、第一回で学んだ6人のテストの平均値をベクトルで表現してみます。今まではベクトルを2次元で考えてきましたが、ここでは6次元のベクトルとなります。6次元と聞いてびっくりするかもしれませんが、2次元ベクトルの性質をそのまま引き継いだ、縦に並ぶただの数字だと思ってください。まずは、6人のテストの点数をベクトルで表し、値がすべて1のベクトルも作っておきます。

 \vec{test}=\begin{pmatrix}
48\\53\\66\\48\\53\\32
\end{pmatrix}\,\,
 \vec{e}=\begin{pmatrix}
1\\1\\1\\1\\1\\1
\end{pmatrix}\\\

ちなみに長さが1となるベクトルのことを単位ベクトルと呼び\vec{e}で表します。

 \||\vec{e}\||=\sqrt{1^{2}+1^{2}+1^{2}+1^{2}+1^{2}+1^{2}+1^{2}}\\\
= 1

このテストベクトルと、単位ベクトルとの内積を求めてみます。

\vec{e}^{T} \cdot \vec{test} = \begin{pmatrix}
1&1&1&1&1&1
\end{pmatrix}
\begin{pmatrix}
48\\53\\66\\48\\53\\32
\end{pmatrix}\\\
=48+53+66+48+53+32\\\
=300

さて、内積が求まりましたが、これを1/6にすれば紛れもなくテストの平均値ですね!

 \dfrac{1}{6}
\vec{e}^{T} \cdot \vec{test}\\
=50

このように、ベクトルや次回学ぶ行列は、たくさんある数字をひと固まりで考えることで、式を簡潔に記述できるだけでなく、計算の処理速度も速くなります。これが、データサイエンスにおいてベクトルや行列を使う最大のメリットです。

# ベクトルによる平均値
vector_test <- c(48,53, 66, 48, 53,32)
#repは繰り返しの関数
vector_e <- rep(1,6)
#平均値の計算
mean_test <- (1/6)(t(vec_e) %% vector_test)
print(mean_test)
     [,1]
[1,]   50
#もちろんmeanで求めれば速い
print(mean(vector_test))
>50

# ベクトルによる平均値
vector_test = np.array([48,53, 66, 48, 53,32])
#np.repeatは繰り返しの関数
vector_e = np.repeat(1,6)
#平均値の計算
mean_test = (1/6)*(np.dot(vector_e.T,vector_test))
print(mean_test)
>50.0
#もちろんnp.meanで求めれば速い
print(np.mean(vector_test))
>50.0

まとめ

今回はデータサイエンス数学、線形代数の中でも基本的なベクトルの概念について書いてきました。今回は視覚的にも分かりやすいように2次元で考えてきましたが、ほとんどの場合ベクトルは4次元以上になります。なかなかイメージしにくいかもしれませんが、いろいろな便利機能をもつ矢印だと思えば、親しみやすいのではないでしょうか?数字が縦に並んでいれば、すべてベクトルとして考えることができることを覚えておきましょう。

最後に、ベクトルのルールをまとめておきます。

  • 数字が縦に並び、方向の要素をもつ矢印をベクトルという。
  • ベクトルの長さをノルムという。
  • ベクトルは、要素ごとに足したり、引いたりできる。
  • ベクトルのかけ算には、定数倍と内積がある。
  • 内積を計算するときは、数字を横に並べる転置を行う必要がある。
  • ベクトルのノルムや、内積は方向の要素をもたないスカラーとなる。
  • 内積は、矢印の方向がどれぐらい似ているのかを表す。
  • 内積が0の時を直交という。
  • 長さが1のベクトルを単位ベクトルと呼ぶ。
  • 重要:ベクトルを使うと、数式を簡潔に記述でき、処理速度が早くなる。

次回は、行列を扱っていきます。

www.medi-08-data-06.work

※本記事は筆者が個人的に学んだことをまとめた記事なります。所属する組織の意見・見解とは無関係です。また、数学の記法や詳細な理論、用語等で誤りがあった際はご指摘頂けると幸いです。

参考

データサイエンスで必要となる数学がほとんど網羅されています。初めての方には、少し難易度が高いですが、数式の導出など丁寧にまとめてあり、脱初心者を目指す方にはとてもおすすめです。

データサイエンスを学び始めて右も左も分からなかったときこの本に出会い、”統計、機械学習を学ぶための数学を学ぶ本”というコンセプトがぴったりで感動した。今、読み直してみるとさらに理解が深まり、データサイエンス数学入門書としては間違いなくおすすめです。