#線形代数
理系大学で絶対に習う線形代数をわかりやすく、かつ論理的にまとめる。ちなみにそれをPythonで実装。たまに、Juliaで実装するかも。。。
・Pythonで動かして学ぶ!あたらしい数学の教科書 -機械学習・深層学習に必要な基礎知識-
・世界基準MIT教科書 ストラング線形代数イントロダクション
を基に線形代数を理解し、pythonで実装。
#環境
・JupyterNotebook
・言語:Python3, Julia1.4
#数式表記
Markdown記法による記述なので、*などの積を表すものについて一部出来ていないところがある。また、数式については、バックフォード
の部分については、数式の見やすさを重視するためであり、コードの一部ではない。
#長さと内積
v = (v₁, v₂)
w = (w₁, w₂)
というベクトルとする。
###内積
内積は、v・wと表す。ほかにもドット積と呼ぶこともある。
v・w = v₁w₁ + v₂*w₂
となる。
このとき、v・w = 0 であれば 直交する。
###長さ
長さは、内積のベクトルが同じものになった時 => 2乗となった時 である。
(内積v・v) = (長さの2乗)
v = (1, 2, 3)としたとき、
│v│² = 1² + 2² + 3² = 14
->これは長さの2乗を表す
すなわち、この2乗を外せば、長さとなるので、
│v│ = √14
となる。別の書き方として、
norm(v) = √14
と書く。これからはnorm()で書く。
これに関しては、実際には三平方の定理と比較してみれば明らかである。
####単位ベクトル
長さが1となるベクトルである。
上のようなベクトルvのとき、長さは√14なので、これを1にするには√14で割ればよい。すなわち、そのベクトルをもとの長さ自身で割れば単位ベクトルとなる。
単位ベクトルをuとするとき、
u = v/norm(v)
このことから、uはvと同方向の長さ1のベクトルを表すことになる。
具体的な数字で表すと、v = (1, 2, 3)としたとき、norm(v) = √14
でなのでそれで割ると、
u = (1/√14, 2/√14, 3/√14)
となることがわかる。
ここで、内積を求めるプログラムと長さを算出するプログラムを書いてみよう。
Python
import numpy as np
import math
v = list()
w = list()
# 要素が3つのベクトルの要素記入
for i in range(3):
vvec = int(input())
v.append(vvec)
for i in range(3):
wvec = int(input())
w.append(wvec)
# 配列の中身の変換
v = np.array(v)
w = np.array(w)
# 内積の計算
print(np.dot(v, w))
# 長さの計算
normv = math.sqrt(np.dot(v, v))
print(normv)
# 実際に計算する際には√をもちいるので
print("√",np.dot(v, v))
Juliaはpythonより難しいので、簡単なコードにする。
v = [1 2 3]
w = [3; 2; 1]
# 内積計算
v*w
# 長さの2乗
normv2 = sum(v.^ 2)
# 長さ
sqrt(normv2)
juliaのコードに関しては、内積計算では無理やり持って行ってるので、もう少し効率のいいコードを後程上げたいと思う。
#最後に
ノルムとかも本来はやるべきだが概要程度にするので省略。