1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

線形独立と基底 : 線形代数をPythonで<6>

Last updated at Posted at 2020-05-25

線形代数

理系大学で絶対に習う線形代数をわかりやすく、かつ論理的にまとめる。ちなみにそれを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要素を持つ列ベクトル同士の判定するプログラム

6pythonlinearindependece
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要素を持つ列ベクトル同士の判定するプログラム

6pythonlinearindependece2
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ではグラフを書くことはできない(?)ぽいので、計算とかの分野でコードを書いていく。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?