数学

pythonによる線形代数演算実習

pythonでベクトルや行列を扱うためには、numpyモジュールをインポートします。

import numpy as np

ベクトル vector

ベクトルとは、いくつかのデータを縦または横に並べて組にしたものです。n個データを並べたものをn次元ベクトルといいます。

列ベクトル column vector
u = np.array([[5], [1], [3]])
print(u)
print('ベクトルの形', u.shape)
行ベクトル row vector:(v1,v2,v3)

転置ベクトル transposed vector

縦ベクトルの場合:縦ベクトルの各成分を順番に横に並べた行ベクトルを、もとの列ベクトルの転置ベクトルといいます。

u_dash = u.transpose()
print(u_dash)
print('ベクトルの形', u_dash.shape)

ベクトルの加算、減算

データの数が同じベクトルであれば、2つのベクトルを加算、減算できます。

u = np.array([[5], [1], [3]])
v = np.array([[1], [0], [6]])

u_plus_v = u + v
print(u_plus_v)

u_minus_v = u - v
print(u_minus_v)

ベクトルの定数倍

ベクトルを定数倍することができます。

c = 3
c_multiply_u = c * u
print(c_multiply_u)

ベクトルのかけ算

行ベクトルと列ベクトルをかけ合わせることができます。

u_dash = u.transpose() # or u.T
v_dash = v.transpose() # or v.T

u_dot_v_dash = np.dot(u, v_dash)
print(u_dot_v_dash)

u_dash_dot_v = np.dot(u_dash, v)
print(u_dash_dot_v)

行ベクトル同士、列ベクトル同士のかけ算はできません。
試してみるとエラーになります。

>>> np.dot(u ,v)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shapes (3,1) and (3,1) not aligned: 1 (dim 1) != 3 (dim 0)

ベクトルの大きさ norm

ベクトルuの大きさを、uのノルムといいます。

u_norm = np.linalg.norm(u)
print(u_norm)

ベクトルの正規化 normalization

ベクトルuをノルムで割ったベクトルを、正規化されたベクトルといいます(長さが1のベクトルです)。

u_normalization = u / u_norm
print(u_normalization)

ベクトルの内積 inner product

それぞれのベクトルの同じ成分どうしを掛けあわせたものを内積といいます。

ここでは、行ベクトルの例です。

a = np.array([5, 1 ,3])
b = np.array([1, 0 ,6])
a_dot_b = np.dot(a, b)
print(a_dot_b)

行列 matrix

行列とは、数値を縦横に並べたものです。横の並びを、縦の並びを、個々の数値を成分といいます。

A=\begin{pmatrix} a_{11}& a_{12}\\ a_{21}& a_{22} \end{pmatrix}

A = np.matrix([[2, 1, 5, 8], [3, 2, 4, 5], [1, 5, 1, 3]])
print(A)
print('行列の形', A.shape)
B = np.matrix([[3, -4, 0, 7], [-2, 5, 4, -5], [-1, 1, 0, 9]])
print(B)
print('行列の形', B.shape)

転置行列 transposed matrix

行列Aの行と列を入れ替えた行列、つまり対角線で成分を折り返した行列を、行列Aの転置行列といい、A’で表します。

A_dash = A.transpose() # or A.T
print(A_dash)
print('行列の形', A_dash.shape)

B_dash = B.transpose() # or B.T
print(B_dash)
print('行列の形', B_dash.shape)

行列の加算、減算

同じ大きさの行列どうしであれば、加算、減算できます。

A + B
A - B

行列の定数倍

行列の各成分を定数倍することができます。

c = 3
c * A

行列のかけ算

l行m列の行列とm行n列の行列をかけ合わせることができます。→ l行n列の行列ができます。
(左側の行列の列の数と、右側の行列の行の数が同じ場合にかけ算ができます。)

np.dot(A, B_dash)
np.dot(A_dash, B)

左側の行列の列の数と、右側の行列の行の数が異なる行列を掛けあわせるとエラーになります。

>>> np.dot(A, B)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shapes (3,4) and (3,4) not aligned: 4 (dim 1) != 3 (dim 0)

零行列 zero matrix

すべての成分が0である行列を、零行列といいます。

O = np.array([[0, 0 ,0], [0, 0 ,0], [0, 0 ,0]])

単位行列 identity matrix

対角線上の成分が1である行列を、単位行列といいます。

I = np.array([[1, 0 ,0], [0, 1 ,0], [0, 0 ,1]])

正方行列 square matrix

縦と横の成分の数が同じ行列を、正方行列といいます。

行列式 determinant

n次の正方行列Aの行列式は|A|またはdet(A)で表します。

A = np.matrix([[1, 2], [3, 4]])
det_A = np.linalg.det(A)
print(det_A)

逆行列 inverse matrix

行列Aについて、行列式|A|≠0の場合、行列Aにかけると単位行列Iになるような行列のことを、行列Aの逆行列といい、A^{-1}で表します。

inv_A = np.linalg.inv(A)

行列Aと逆行列A^{-1}をかけると、単位行列になることがわかります。

np.dot(A, inv_A)

3次の行列についても確認してみます。

B = np.matrix([[9, 2, 3], [4, 5, 6], [7, 8, 1]])
det_B = np.linalg.det(B)
print(det_B)
inv_B = np.linalg.inv(B)
print(inv_B)

np.dot(B, inv_B)

固有値 eigenvalueと固有ベクトル eigenvector

n次正方行列をA、n次元ベクトルをuとします。Aに対して、

Au = λu

を満たすλと列ベクトルuが存在するとき、λをAの固有値、uを固有値λに対する固有ベクトルといいます。ただし、uは零ベクトルではありません。

A = np.matrix([[3, 1], [2, 2]])
la, v = np.linalg.eig(A)
print('Aの固有値', la)
print('Aの固有ベクトル', v)

カテゴリー