Math & Linear Algebra/Concepts

Linear Equation & Linear System / Rank & det(A)

metamong 2023. 2. 1.

Linear Equation

πŸ‘πŸ» μ„ ν˜• λ°©μ •μ‹μ΄λž€, λ³€μˆ˜ $x_1, x_2, .. x_n$이 있고, $a_1x_1 + a_2x_2 + ... + a_nx_n = b$둜 λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 방정식을 λœ»ν•œλ‹€.

(b와 κ³„μˆ˜ a_1, a_2, ~ a_n은 μ‹€μˆ˜ λ˜λŠ” λ³΅μ†Œμˆ˜)

 

πŸ‘πŸ» μœ„ equation은 μ΄λ ‡κ²Œλ„ ν‘œν˜„ κ°€λŠ₯ν•˜λ‹€.

$a^Tx = b$

$$a = \begin{bmatrix} a_1 \\ a_2 \\ \vdots \\ a_n \end{bmatrix}, x = \begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_n \end{bmatrix}$$

Linear System

πŸ‘πŸ» μ„ ν˜• μ‹œμŠ€ν…œμ€ μ•žμ„œ μ„€λͺ…ν•œ linear equation이 1개 이상 κ΅¬μ„±λœ μ‹œμŠ€ν…œμ„ λœ»ν•œλ‹€

 

πŸ‘πŸ» μ˜ˆμ‹œ)

ID A B C life-span
1 60 5.5 1 66
2 65 5.0 0 74
3 55 6.0 1 78

 

→ 이λ₯Ό μ•„λž˜μ™€ 같은 linear system으둜 ν‘œν˜„ν•  수 μžˆλ‹€.

 

$60x_1 + 5.5x_2 + 1*x_3 = 66$

$65x_1 + 5.0x_2 + 0*x_3 = 74$

$55x_1 + 6.0x_2 + 1*x_3 = 78$

 

→ 즉, $x_1, x_2, x_3$κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ life-span을 μ•Œ 수 있게 λœλ‹€.

 

→ linear system은 matrix 행렬을 μ΄μš©ν•΄μ„œ ν‘œν˜„ν•  수 μžˆλ‹€.

 

β€» ν–‰λ ¬ κ΄€λ ¨ ν¬μŠ€νŒ… μ•„λž˜ μ°Έμ‘° β€»

 

Matrix

🌻 사싀 이거 λ‹€λ£°λ €κ³  Scalar & Vector 배운 거라 ν•  μ •λ„λ‘œ 행렬은.. μ„ ν˜•λŒ€μˆ˜ν•™μ˜ 꽃! 🌻 Scalar & Vector (fundamentals) β–Ά Linear Algebra ν•˜λ©΄? λ‹Ήμ—°νžˆ μ•Œμ•„μ•Ό ν•  기본은 'Scalar(슀칼라)' & 'Vector(벑터)' & 'Matri

sh-avid-learner.tistory.com

 

 

→ 이λ₯Ό inverse matrixλ₯Ό μ΄μš©ν•΄ 풀어보면

 

$Ax = b$

$A^{-1}Ax = A^{-1}b$

$I_nx = A^{-1}b$

$x = A^{-1}b$

 

→ 즉, μš°λ¦¬λŠ” life-span = $-0.4x_1 + 20x_2 - 20x_3$둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

 

πŸ‘πŸ» λ§Œμ•½, ν–‰λ ¬ Aκ°€ non-invertible이라면(역행렬을 ꡬ할 수 μ—†λ‹€λ©΄)?

ν•΄κ°€ μ—†κ±°λ‚˜, 무수히 λ§Žμ€ 경우

→ μœ„ μ˜ˆμ‹œλ‘œ λ“  linear systemμ—μ„œ m을 linear equation의 개수, n을 variable(독립 λ³€μˆ˜)의 개수라고 ν•˜λ©΄,

β‘  m<n: variable이 더 λ§Žμ„ 경우 주둜 무수히 λ§Žμ€ ν•΄κ°€ 쑴재 (under-determined system)

(μ—¬λŸ¬ ν•΄ 쀑에 일뢀 ν•΄, 특히 μ’…μ†λ³€μˆ˜μ— 더 큰 variation을 λ³΄μ΄λŠ” 경우 regularization을 μ μš©ν•˜λŠ” λ“± μ—¬λŸ¬ 쑰치λ₯Ό μ·¨ν•  수 있음)

β‘‘ m>n: equation이 더 λ§Žμ„ 경우 주둜 ν•΄κ°€ μ—†μŒ (over-determined system)

 

πŸ‘πŸ» Ax=bλ₯Ό κΈ°ν•˜ν•™μ μΈ 의미둜 ν•΄μ„ν•œλ‹€λ©΄, xκ°€ λ‚˜νƒ€λ‚΄λŠ” 2μ°¨μ›μ˜ 점이 Aλ₯Ό ν†΅ν•΄μ„œ bλΌλŠ” 점으둜 μ΄λ™ν•œλ‹€λŠ” 것을 λœ»ν•œλ‹€. 즉, A λ³€ν™˜μ„ ν†΅ν•΄μ„œ b둜 μ΄λ™ν•œ 점(x)을 μ°ΎλŠ”λ‹€.

(μ—¬κΈ°μ„œ vector x와 bλŠ” λͺ¨λ‘ 2차원이고, 점으둜 λ‚˜νƒ€λ‚Ό 수 있으며, A둜 μΈν•œ linear transformation / κ·Έ μ—­μ˜ transformation을 그림으둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™λ‹€.)

Rank

πŸ‘πŸ» ν–‰λ ¬ A의 rankλŠ” μ„œλ‘œ μ„ ν˜•λ…λ¦½μΈ(linearly independent) A의 ν–‰μ˜ 갯수(λ˜λŠ” μ—΄μ˜ 갯수)λ₯Ό λœ»ν•œλ‹€.

 

πŸ‘πŸ» μ„ ν˜•λ…λ¦½ - 'μ–΄λ– ν•œ ν–‰(ν˜Ήμ€ μ—΄)이 ν–‰λ ¬μ˜ λ‹€λ₯Έ ν–‰(μ—΄)λ“€μ˜ μ„ ν˜• μ‘°ν•©μœΌλ‘œ ν‘œν˜„μ΄ μ•ˆλ˜λŠ” 경우'

ex)  μ•„λž˜μ˜ ν–‰λ ¬ AλŠ” rankκ°€ 2 / BλŠ” rankκ°€ 1

πŸ‘πŸ» λ”°λΌμ„œ, full-rank matrixλŠ” nxn A 행렬에 λŒ€ν•΄μ„œ λͺ¨λ“  행이 μ„œλ‘œ μ„ ν˜•λ…λ¦½μ΄κ±°λ‚˜ / λͺ¨λ“  열이 μ„œλ‘œ μ„ ν˜•λ…λ¦½μΈ matrixλ₯Ό λœ»ν•˜κ³ , 이λ₯Ό non-singular 행렬이라고도 ν•˜λ©°, 역행렬이 μ‘΄μž¬ν•¨μ„ λœ»ν•œλ‹€.

 

πŸ‘πŸ» κ·Έ λ°˜λŒ€λ‘œ, full-rank matrixκ°€ μ•„λ‹ˆλΌλ©΄ singular 행렬이라 λΆ€λ₯΄κ³ , 역행렬이 μ—†μŒμ„ λœ»ν•œλ‹€.

 

πŸ‘πŸ» RankλŠ” numpy의 linalg.matrix_rank() μ‚¬μš©

A = np.array([[1, 2],
              [2, 5]])
              
np.linalg.matrix_rank(A) #2

B = np.array([[1, 2],
             [2, 4]])

np.linalg.matrix_rank(B) #1
np.linalg.inv(B) #LinAlgError: Singular matrix

* singular matrix

β‘  각 행이 μ„œλ‘œ μ„ ν˜•λ…λ¦½μ΄ μ•„λ‹˜ (뢈λŠ₯ - λ§Œμ‘±ν•˜λŠ” ν•΄κ°€ ν•˜λ‚˜λ„ μ—†λ‹€.)

β‘‘ ν•˜λ‚˜μ˜ 행이 λ‹€λ₯Έ ν–‰μ˜ scalar 배둜 ν‘œν˜„ (λΆ€μ • - λ§Œμ‘±ν•˜λŠ” ν•΄κ°€ 무수히 λ§Žλ‹€.)

 

πŸ‘πŸ» 행렬식(determinant)κ°€ 0인 경우(ad-bc=0) 역행렬이 μ—†λ‹€.

πŸ‘πŸ» matrix의 행렬식은 |A|둜 ν‘œν˜„

 

ex) Ax=yμ—μ„œ

β‘  $\cfrac{a}{c} ≠ \cfrac{y_1}{y_2}$이면 뢈λŠ₯

β‘‘ $\cfrac{a}{c} = \cfrac{y_1}{y_2}$이면 λΆ€μ •

 

πŸ‘πŸ» 뢈λŠ₯의 κΈ°ν•˜ν•™μ  의미

→ Ax=yμ—μ„œ A에 μ˜ν•΄ y둜 이동될 수 μžˆλŠ” vector xκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€

 

πŸ‘πŸ» λΆ€μ •μ˜ κΈ°ν•˜ν•™μ  의미

→ Ax=yμ—μ„œ A에 μ˜ν•΄ y둜 이동될 수 μžˆλŠ” vector xκ°€ 무수히 μ‘΄μž¬ν•œλ‹€

(μœ„ μ™Όμͺ½ 그림은 뢈λŠ₯ / 였λ₯Έμͺ½ 그림은 λΆ€μ •)

det(A)

πŸ‘πŸ» |det(A)| = |ad-bc|둜, ν–‰λ ¬μ‹μ˜ μ ˆλŒ“κ°’μ€ ν–‰λ ¬ Aλ₯Ό 톡해 λ‹¨μœ„κ³΅κ°„μ„ μ–Όλ§ˆλ‚˜ λŠ˜λ ΈλŠ”μ§€ / μ€„μ˜€λŠ”μ§€ (넓이배)λ₯Ό μ˜λ―Έν•œλ‹€

 

πŸ‘πŸ» ex) μ•„λž˜μ™€ 같은 linear transformation κ°€μ •ν•˜λ©΄,

→ 각 μΆ• λ³„λ‘œ 1μ”© 이루어진 λ‹¨μœ„κ³΅κ°„μ˜ 넓이가 1μ—μ„œ λ³€ν™˜ ν›„ 4둜 컀짐. 즉, κΈ°μ‘΄ κ³΅κ°„μ—μ„œ 4λ°° μ»€μ‘ŒμœΌλ―€λ‘œ A의 행렬식은 넓이배

 

πŸ‘πŸ» λ”°λΌμ„œ 행렬식이 0인 κ²½μš°λŠ” 넓이가 μ—†λŠ” ν•œ 점으둜 λ³€ν™˜λ˜μ—ˆμœΌλ―€λ‘œ, μ΄λŠ” 역행렬이 μ—†λ‹€λŠ” 것을 λœ»ν•¨

 

πŸ‘πŸ» numpy의 linalg.det() μ‚¬μš©

A
'''
array([[1, 2],
       [3, 4]])
'''

np.linalg.det(A) #-2.0000000000000004

B
'''
array([[1, 2],
       [2, 4]])
'''

np.linalg.det(B) #0.0

* python

1) column vector & row vector

πŸ‘πŸ» column vectorλŠ” numpy의 arrayλ₯Ό μ‚¬μš©ν•΄ []μ•ˆμ— μ›ν•˜λŠ” elementλ₯Ό μ—¬λŸ¬ 개 μ“°λ©΄ 되고, row vectorλŠ” []μ•ˆμ— [] bracket을 ν•œ 번 더 μ¨μ„œ 행을 μ„ μ–Έν•œ λ‹€μŒ, ν–‰ μ•ˆμ— μ›ν•˜λŠ” μ›μ†Œλ₯Ό μ‚½μž…ν•˜λ©΄ λœλ‹€.

 

→ column vector

import numpy as np

#column vector
c=np.array([1,2,3])
print(c.shape) #1-dimension array
#(3,)

#obtaining a particular entry
print(c[0])
#1

 

→ row vector

#row vector
r=np.array([[1,2,3]])
print(r.shape) #(1, 3)

#obtaining a particular entry
print(r[0,1]) #2

2) matrix

λ‹€μ–‘ν•œ ν˜•νƒœμ˜ matrix λ§Œλ“€κΈ°

#creating a matrix with all zeros
a=np.zeros((2,2))
print(a)
'''
[[0. 0.]
 [0. 0.]]
'''

#creating a matrix with all ones
b=np.ones((2,2))
print(b)
'''
[[1. 1.]
 [1. 1.]]
'''

#creating a matrix filled with the same constant
c=np.full((2,2),7)
print(c)
'''
[[7 7]
 [7 7]]
'''

#creating a matrix with random values
d=np.random.random((2,2))
print(d)
'''
[[0.61959397 0.13857043]
 [0.0815273  0.50410076]]
'''

 

πŸ‘πŸ» μ „μΉ˜ν–‰λ ¬μ„ λ§Œλ“€λ €λ©΄ A.T, 즉 뒀에 .Tλ₯Ό 뢙이면 되고, ν–‰λ ¬μ˜ 곱은 np.dot(A,B)λ₯Ό μ‚¬μš©ν•˜λ©΄ λœλ‹€

(μ„Έ 개 μ΄μƒμ˜ 행렬도 np.dot() μ•ˆμ— λ„£μœΌλ©΄ λœλ‹€)

β€» 주의점: ν–‰λ ¬ κ³± μ—°μ‚°μ—μ„œ np.dot()이 μ•„λ‹ˆλΌ, * μ—°μ‚°μžλ₯Ό μ¨μ„œλŠ” μ•ˆλœλ‹€)

#creating a matrix
A=np.array([[1,2],[3,4],[5,6]])
'''
[[1 2]
 [3 4]
 [5 6]]
 '''
 
 #creating another matrix
B=np.array([[11,12,13,14],[15,16,17,18]])
'''
array([[11, 12, 13, 14],
       [15, 16, 17, 18]])
'''

#transpose a matrix
A.T
'''
array([[1, 3, 5],
       [2, 4, 6]])
'''

#matrix-matrix multiplication
np.dot(A,B)
'''
array([[ 41,  44,  47,  50],
       [ 93, 100, 107, 114],
       [145, 156, 167, 178]])
'''

 

→ 이 λ•Œ, λ‹Ήμ—°νžˆ ν–‰λ ¬ κ³± μ—°μ‚°(AB)μ—μ„œ, A의 μ—΄κ³Ό B의 ν–‰ κ°œμˆ˜κ°€ κ°™μ•„μ•Ό ν•œλ‹€. (그렇지 μ•ŠμœΌλ©΄ 였λ₯˜)

#matrix-matrix multiplication
#size should match!
np.dot(B,A)
#ValueError: shapes (2,4) and (3,2) not aligned: 4 (dim 1) != 3 (dim 0)

3) linear system 예제 ν’€κΈ°

πŸ‘πŸ» inv() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ 주어진 ν–‰λ ¬μ˜ 역행렬을 ꡬ할 수 있고, μ•žμ„œ μ–ΈκΈ‰ν•œ ν–‰λ ¬ κ³± ν•¨μˆ˜ dot()을 μ΄μš©ν•΄ μ΅œμ’… ν•΄λ₯Ό ꡬ할 수 μžˆλ‹€.

#coefficient matrix A and a vector b
A=np.array([[60, 5.5, 1], [65, 5.0, 0], [55, 6.0, 1]])
b=np.array([66,70,78])

#identity matrix
eye3=np.eye(3)
'''
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
'''

#computing an inverse
from numpy.linalg import inv
A_inv = inv(A)

#solution of a linear system
x=A_inv.dot(b)
x
#answer: array([ -0.43478261,  19.65217391, -16.        ])

 

πŸ‘πŸ» λΉ λ₯Έ λ°©λ²•μœΌλ‘œ, matrix A와 μ’…μ†λ³€μˆ˜κ°’μ΄ λ‚˜μ—΄λœ μ—΄ 벑터 bκ°€ μžˆμ„ λ•Œ, 해집합을 κ΅¬ν•˜λŠ” solveλΌλŠ” 자체 ν•¨μˆ˜λ₯Ό 지원해쀀닀.

#a better way to solve the same linear system
from numpy.linalg import solve
x=solve(A,b)
x
#array([ -0.43478261,  19.65217391, -16.        ])

* 좜처1) 인곡지λŠ₯을 μœ„ν•œ μ„ ν˜•λŒ€μˆ˜ (주재걸 ꡐ수)

* 좜처2) λŒ€ν•™μ› μ‚¬μ „κ΅μœ‘ <데이터뢄석을 μœ„ν•œ κΈ°μ΄ˆμˆ˜ν•™>

'Math & Linear Algebra > Concepts' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

eigendecomposition  (0) 2023.02.19
vector similarity  (0) 2023.02.09
Matrix (fundamentals)  (0) 2022.07.31
Odds Ratio & log(Odds Ratio)  (0) 2022.07.11
eigenvalue & eigenvector  (0) 2022.05.14

λŒ“κΈ€