Scipy - matrix exponential
๐ ๋ชฉ์ฐจ (Contents)
matrix exponential: scipy.linalg.expm(A)
- matrix exponential์ square matrix์ exponential function์ ์ ์ฉํ์ฌ ๋์ถ๋ matrix๋ฅผ ๋งํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์๊ฐํ๋
exp(x)์ ๋์ผํฉ๋๋ค. ๋ค๋ง, ์ ์ฉํ๋ ๋์์ผ 1์ฐจ์์ ์๊ฐ ์๋๋ผ, matrix๋ผ๋ ๊ฒ์ด ๋ค๋ฅผ ๋ฟ์ด์ฃ . - ์๋์ ๊ฐ๋จํ ์ฝ๋๋ฅผ ๋ณด์๋ฉด,
- ์ฒซ๋ฒ์งธ๋ matrix์ ๋ํด์ exponential function์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ zero matrix์ ๋ํด์ ์ ์ฉํ์ ๋, ์ ์์ ์ธ
identity matrix๊ฐ ๋์ค์ง๋ง, - ๋๋ฒ์งธ ์ฝ๋์ ๊ฒฝ์ฐ๋
Identity matrix๊ฐ ๋์ค์ง ์์ต๋๋ค.
- ์ฒซ๋ฒ์งธ๋ matrix์ ๋ํด์ exponential function์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ zero matrix์ ๋ํด์ ์ ์ฉํ์ ๋, ์ ์์ ์ธ
A = np.zeros([2, 2]) # zero matrix
# applied matrix exponential function for matrix
assert np.all(
scipy.linalg.expm(A) == np.identity(2)
)
# applied just exponential function for matrix
assert np.all(
np.exp(A)== np.array([1, 1, 1, 1]).reshape(2, 2)
)
Use scipy.linalg.expm
scipy.linalg.expm๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
import numpy as np
from scipy import linalg as sp_linalg
"""
- 1์ฐจ์์ ๊ฐ๋ค์ ๋ํด์๋ np.exp()๋ก ๊ฐ๋จํ๊ฒ exponential์ ์ ์ฉํ ์ ์๋ค.
- ๊ทธ๋ฌ๋, 1์ฐจ์์ด ์๋ matrix์ธ ๊ตฌ์กฐ์ผ ๋๋ np.exp()๋ฅผ matrix์ ๊ฐ element์ exponential์ ์ฒ๋ฆฌํ๋ค๊ณ ํด์,
์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์๋๋ค.
- ์ด์ฒ๋ผ matrix์ ๋ํด์ exponential์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํจ์๊ฐ ๋ฐ๋ก `sp_linalg.expm`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- check1: ์ฐ์ , `sp_linalg.expm(zero_matrix)== Identity matrix`๋ฅผ ํ์ธ
- check2: euler identity ์ matrix form์ ์ ์ฉ.
"""
N = 2
zero_mat = np.zeros([N, N])
print("== zero_mat")
print(zero_mat)
print("--"*20)
# ํด๋น matrix์ exponential ๋ฅผ ์ ์ฉํจ.
# zero์ ์ ์ฉํ ๊ฒ์ด๋ฏ๋ก, exp(Zeros) = I ๊ฐ ๋์ค๊ฒ ๋จ.
print("== sp_linalg.expm(zero_mat)")
print(sp_linalg.expm(zero_mat))
print("--" * 20)
# ๋ฐ๋๋ก, ๊ทธ๋๋ก np.exp๋ฅผ ์์ฐ๋ฉด ๋ชจ๋ ๋ชจ๋ ์์๊ฐ 1์ด๋ฏ๋ก, matrix์ ๋ง๋ function์ด ์๋
print("== np.exp(zero_mat)")
print(np.exp(zero_mat))
print("--" * 20)
"""
Eulerโs identity (exp(i*theta) = cos(theta) + i*sin(theta)) applied to a matrix:
"""
N = 2
X = np.random.normal(0, 1, N**2).reshape(N, N)
# `j` means imaginary parth
LHS = sp_linalg.expm(1j*X) # ij*X ์ exponential function ์ ์ฉ
RHS = sp_linalg.cosm(X) + 1j*sp_linalg.sinm(X)
print("== LHS")
print(LHS)
print("--" * 20)
print("== RHS")
print(RHS)
print("--" * 20)
== zero_mat
[[0. 0.]
[0. 0.]]
----------------------------------------
== sp_linalg.expm(zero_mat)
[[1. 0.]
[0. 1.]]
----------------------------------------
== np.exp(zero_mat)
[[1. 1.]
[1. 1.]]
----------------------------------------
== LHS
[[-0.87798962+0.62059534j 0.6962854 -0.2663728j ]
[-0.19544771+0.074771j 1.06801666-0.12387402j]]
----------------------------------------
== RHS
[[-0.87798962+0.62059534j 0.6962854 -0.2663728j ]
[-0.19544771+0.074771j 1.06801666-0.12387402j]]
----------------------------------------
wrap-up
- ๋ค์ ๋งํ์ง๋ง, ๋ถ๋ช ํ ๊ณผ๊ฑฐ์ ๋ค ๋ฐฐ์ ๋ ๋ด์ฉ์ผ ๊ฒ๋๋ค. ์ฌ์ค ์์์ ์ผ๋ก๋ง ์๊ฐํด๋, matrix์ ์ ์ฉํ ๋๋ ํจ์๋ค์ด ๋ค๋ฅธ ํํ์ฌ์ผ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ์ด์ ๋ ์ด๋ฐ๊ฒ๋ ๋ค์ ๋ณต๊ธฐํ๋๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ค์.
reference
GitHub์์ ์ด ๊ธ์ ๋งํฌ๋ค์ด ์๋ณธ ๋ณด๊ธฐ & ์์ ์ ์src/content/posts/2020-02-04-np_matrix_exponential
๐ ์ฐ๊ด ์ง์ ํ๋ธ:๐ python-libs ์นดํ
๊ณ ๋ฆฌ๐ Python ์ปค๋ฆฌํ๋ผ#python#python-libs#numpy
๐กRELATED ARTICLES ยท ํจ๊ป ์ฝ์ผ๋ฉด ์ข์ ์ฐ๊ด ํฌ์คํธ
python-libs
Random.expovariate == np.random.exponential
์ฝ์ด๋ณด๊ธฐ→
python-libs
Numba๋ฅผ ์ฌ์ฉํด์ numpy.random.choice๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋ค์ด ๋ด ์๋ค.
์ฝ์ด๋ณด๊ธฐ→
python-libs
Python: TypeError - Object of type 'int64' is not JSON serializable
์ฝ์ด๋ณด๊ธฐ→
python-libs
Np.random.seed()๋ ์ ํํ ๋ฌด์์ ์๋ฏธํ๋๊ฐ?
์ฝ์ด๋ณด๊ธฐ→