ベクトルと行列は、データサイエンスの中でも頻出であり、とてもとても便利な概念です。今回からは、今まで学んだ平均や分散、微分、最小二乗法などを使って、ベクトルや行列の概念にふれていきます。
今回の目的は以下になります。
- ベクトルとは何かを理解する。 - ベクトルを作って、平均値を計算できるようになる。
誰が読んでも理解できることを目指していますので、分かりにくい、理解できない等ありましたら、お気軽にコメント頂けると幸いです。なお、RやPythonを使わなくても、学ぶことができる内容ですので、数学の知識だけ学びたいという方も是非ご覧ください(^^)
ベクトルの基礎
ベクトルとは、ずばり座標で表される矢印ことです。しかし、多くの場合は4次元以上のベクトルになり、想像ができなくなるので、二次元の矢印で考えてみます。
この矢印は、右に3、上に5進んだ矢印で、数学では
と表します。文字は何でもよいのですが、今回はxとしました。書き方は、文字の上に矢印をつけるか、太文字にするのが一般的です。重要なのは、ベクトルは基本的に数字が縦に並んでいるということです。また、ベクトルは矢印なので、方向の要素をもちます。(意味が分からなくても、何となく頭の隅に置いておいてください。)
ベクトルの長さ
まずは、ベクトルの長さについてです。ベクトルの長さのことをノルムと呼び、文字を二重線で囲って表します。
直感的には三平方の定理から理解することもできます。ベクトルのノルムは、方向の要素を持たないただの数字となり、方向の要素をもつベクトルと対応して、スカラーとも呼びます。スカラーと書いてあったら、ただの数字だと思ってください。
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つ目のベクトルを足します。やり方はベクトルの要素ごとに数字を足し合わせるだけです。
足し算の意味を視覚的に表わすとこんな感じになります。
引き算も同様ですね。
# 足し算引き算 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]
ベクトルの定数倍と内積
ベクトルには定数をかける定数倍と、ベクトル同士をかける内積という概念があります。定数倍はとても簡単で、それぞれの要素に定数をかけます。矢印の長さが伸びるイメージですね。
一方で、内積とは要素ごとに数字をかけて、それを足し合わせた値です。内積の値はベクトルではなく、ただの数字、つまりスカラーとなります。ここで、ベクトルは基本的に縦で表されると書きましたが、内積をする際には、横×縦にします。ベクトルを縦から横に変換することを転置といってこのように表現します。(おそらく転置は、主に行列に用いる概念ですが、今後の分かりやすさを踏まえて、あえてベクトルの転置と表現しています。)
そして内積は、点で表します。
ベクトルの内積は、長さが同じで、横×縦の形にする必要があるということをおさえておくと、今後の行列計算にも役に立ちます。やってみましょう。
さて、この内積は何を意味しているのかですが、これは左側のベクトル上に右側のベクトルを影のように写した長さに、左側のベクトルの長さをかけたものです。
これを理解するには三角関数を使う必要があるのですが、私が説明するよりもこちらの記事を読まれるといいです。
【内積とは】ベクトルの内積の意味や公式・計算方法を知って大学合格へ! | 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°になっています。これをベクトルの直交といってこのように表します。
このベクトルの直交は、非常によく出てくる理論なので覚えておきましょう。
ベクトルを使った平均値
ベクトルの考えをさらに深めるため、第一回で学んだ6人のテストの平均値をベクトルで表現してみます。今まではベクトルを2次元で考えてきましたが、ここでは6次元のベクトルとなります。6次元と聞いてびっくりするかもしれませんが、2次元ベクトルの性質をそのまま引き継いだ、縦に並ぶただの数字だと思ってください。まずは、6人のテストの点数をベクトルで表し、値がすべて1のベクトルも作っておきます。
ちなみに長さが1となるベクトルのことを単位ベクトルと呼びで表します。
このテストベクトルと、単位ベクトルとの内積を求めてみます。
さて、内積が求まりましたが、これを1/6にすれば紛れもなくテストの平均値ですね!
このように、ベクトルや次回学ぶ行列は、たくさんある数字をひと固まりで考えることで、式を簡潔に記述できるだけでなく、計算の処理速度も速くなります。これが、データサイエンスにおいてベクトルや行列を使う最大のメリットです。
# ベクトルによる平均値 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のベクトルを単位ベクトルと呼ぶ。
- 重要:ベクトルを使うと、数式を簡潔に記述でき、処理速度が早くなる。
次回は、行列を扱っていきます。
※本記事は筆者が個人的に学んだことをまとめた記事なります。所属する組織の意見・見解とは無関係です。また、数学の記法や詳細な理論、用語等で誤りがあった際はご指摘頂けると幸いです。
参考
データサイエンスで必要となる数学がほとんど網羅されています。初めての方には、少し難易度が高いですが、数式の導出など丁寧にまとめてあり、脱初心者を目指す方にはとてもおすすめです。
データサイエンスを学び始めて右も左も分からなかったときこの本に出会い、”統計、機械学習を学ぶための数学を学ぶ本”というコンセプトがぴったりで感動した。今、読み直してみるとさらに理解が深まり、データサイエンス数学入門書としては間違いなくおすすめです。
統計学が最強の学問である[数学編]――データ分析と機械学習のための新しい教科書
- 作者:西内 啓
- 発売日: 2017/12/21
- メディア: 単行本(ソフトカバー)