線形代数
理系大学で絶対に習う線形代数をわかりやすく、かつ論理的にまとめる。ちなみにそれをPythonで実装。たまに、Juliaで実装するかも。。。
・Pythonで動かして学ぶ!あたらしい数学の教科書 -機械学習・深層学習に必要な基礎知識-
・世界基準MIT教科書 ストラング線形代数イントロダクション
を基に線形代数を理解し、pythonで実装。
環境
・JupyterNotebook
・言語:Python3, Julia1.4.0
線形独立
線形独立イメージ
線形結合である
av + bw
の形のことを基に話す。v,wというベクトルは方向ベクトルが違う必要がある。
例えば、
\vec{v}=\begin{pmatrix}2\\3\end{pmatrix}
,
\vec{w}=\begin{pmatrix}1\\-2\end{pmatrix}
のような関係のことである。これは前回やったように、二つのベクトルが角度をnπ(n=0, 1, 2,...)を満たさない角度をなすことをいう。すなわち、
\vec{v}=\begin{pmatrix}2\\3\end{pmatrix}
,
\vec{w}=\begin{pmatrix}4\\6\end{pmatrix}
\\
\\
\vec{v}=α\vec{w}
上のようにスカラー積関係、倍数関係になったものを線形従属
という。ならないもの線形独立
という。たとえ2つでなく、3つでもそれぞれが独立しなければならない。
イメージではこんな感じでいいだろう。
#####線形独立の定義
定義
Ax= 0のかいがx=0のみであるとき,列ベクトルは線形代数である.列ベクトルの線形結合Axにおいて零ベクトルとなるものは他にない.
ベクトルの列v_1,v_2,....,v_nは,零ベクトルとなる線形結合が
0v_1+0v_2+...+0v_n
のみであるとき,線形独立である.
すなわち、
すべてのx_iが零のときのみ,\\
x_1v_1+x_2v_2+...+x_nv_n=0\\
となる.
このようにならない場合が線形従属という。
###プログラム
#####2つの2要素を持つ列ベクトル同士の判定するプログラム
import numpy as np
v = list()
w = list()
for i in range(2):
vbec = int(input())
v.append(vbec)
for i in range(2):
wbec = int(input())
w.append(wbec)
v = np.array(v)
w = np.array(w)
sarrus = v[0]*v[1] - v[1]*v[0]
if sarrus == 0:
print("線形従属")
else:
print("線形独立")
Pythonで線形代数をやってみた(2)にあるコードを少しだけ書き換えたものである。
これは2つの要素を持つベクトル同士でないと判定できない。
最初に要素数をしてして、独立か従属かを判定するプログラムは以下のようになる。
#####2つのn要素を持つ列ベクトル同士の判定するプログラム
import numpy as np
n = int(input())
# =>3
v = list()
w = list()
for i in range(n):
vbec = int(input())
v.append(vbec)
for i in range(n):
wbec = int(input())
w.append(wbec)
v = np.array(v)
w = np.array(w)
# =>1
# =>2
# =>3
# =>3
# =>2
# =>1
x = list()
c = v[0]/w[0]
for i in range(n):
if v[i] == c*w[i]:
x.append("True")
continue
else:
break
if len(x) == n:
print("線形従属")
elif len(x) < n:
print("線形独立")
# =>線形独立
基底
#####ベクトル空間の基底の定義
定義
ベクトル空間の基底とは,次の2つの性質を持つようなベクトルの列である: ***基底ベクトルは,線形独立であり,空間を張る.***
ここでの基底についての詳しい説明は省く。
#####標準基底
具体例
I =
\begin{bmatrix}
1 & 0\\
0 & 1
\end{bmatrix}
の列ベクトルはR^2の標準基底である.
これより以下のように言える。
(n×n)単位行列の列ベクトルはR^nの「標準基底」である.
さらに、
すべての(n×n)行列の列ベクトルはR^nの「標準基底」である
次元についてもここでは省略。
###プログラム
\vec{e_x}=\begin{pmatrix}1\\0\end{pmatrix},
\vec{e_y}=\begin{pmatrix}0\\1\end{pmatrix}
とするとき,a=(2,3)は次のように表せる。
\vec{a}=\begin{pmatrix}2\\3\end{pmatrix}=2\vec{e_x}+3\vec{e_y}
=2\begin{pmatrix}0\\1\end{pmatrix}+3\begin{pmatrix}1\\0\end{pmatrix}
これより
\vec{a},\vec{e_x},\vec{e_y}
の3つのベクトルを描写する。
Pythonで線形代数をやってみた(5)のベクトル3つverなので、新しくはない。
#####元のベクトルと標準基底の描写プログラム
import numpy as np
import matplotlib.pyplot as plt
a = np.array([2, 3])
e_x = np.array([1, 0])
e_y = np.array([0, 1])
print("a:", a)
print("e_x:", e_x)
print("e_y:", e_y)
def arrow(start, size, color):
plt.quiver(start[0], start[1], size[0], size[1],
angles="xy", scale_units="xy", scale=1, color=color)
s = np.array([0, 0]) # 原点
arrow(s, a, color="blue")
arrow(s, e_x, color="red")
arrow(s, e_y, color="red")
# グラフ表示
plt.xlim([-3,3]) # xの表示範囲
plt.ylim([-3,3]) # yの表示範囲
plt.xlabel("x", size=14)
plt.ylabel("y", size=14)
plt.grid()
plt.axes().set_aspect("equal") # 縦横比を同じに
plt.show()
#さいごに
そんなに難しいこともしてない。pythonの方は、少し遠回りのコードを書いている。(原理わかりやすいように)
juliaではグラフを書くことはできない(?)ぽいので、計算とかの分野でコードを書いていく。