본문 바로가기
Study/Mathematics

[선형대수학] 아핀 변환, 고유벡터, 고유값 분해

by zyhu_n 2023. 11. 8.
728x90

01. 아핀 변환 Affine Transformation

 

v = np.array([3, 1])
v
# array([3, 1])

import matplotlib.pyplot as plt

def plot_vectors(vectors, colors):
    """
    Plot one or more vectors in a 2D plane, specifying a color for each. 

    Arguments
    ---------
    vectors: list of lists or of arrays
        Coordinates of the vectors to plot. For example, [[1, 3], [2, 2]] 
        contains two vectors to plot, [1, 3] and [2, 2].
    colors: list
        Colors of the vectors. For instance: ['red', 'blue'] will display the
        first vector in red and the second in blue.
        
    Example
    -------
    plot_vectors([[1, 3], [2, 2]], ['red', 'blue'])
    plt.xlim(-1, 4)
    plt.ylim(-1, 4)
    """
    plt.figure()
    plt.axvline(x=0, color='lightgray')
    plt.axhline(y=0, color='lightgray')

    for i in range(len(vectors)):
        x = np.concatenate([[0,0],vectors[i]])
        plt.quiver([x[0]], [x[1]], [x[2]], [x[3]],
                   angles='xy', scale_units='xy', scale=1, color=colors[i],)
    
    
plot_vectors([v], ['lightblue'])
plt.xlim(-1, 5)
_ = plt.ylim(-1, 5)

 

 

E = np.array([[1, 0], [0, -1]])
E
# array([[ 1,  0],
#        [ 0, -1]])

Ev = np.dot(E, v)
Ev
# array([ 3, -1])

plot_vectors([v, Ev], ['lightblue', 'blue'])
plt.xlim(-1, 5)
_ = plt.ylim(-3, 3)

 

 

F = np.array([[-1, 0], [0, 1]])
F 
# array([[-1,  0],
#        [ 0,  1]])

Fv = np.dot(F, v)
Fv
# array([-3,  1])

plot_vectors([v, Fv], ['lightblue', 'blue'])
plt.xlim(-4, 4)
_ = plt.ylim(-1, 5)

 

 

 

 

 

02. 고유벡터와 고유값 Eigenvectors and Eigenvalues

 

A
# array([[-1,  4],
#        [ 2, -2]])

lambdas, V = np.linalg.eig(A) 
V # A의 열 개수만큼의 고유벡터를 가짐
# array([[ 0.86011126, -0.76454754],
#        [ 0.51010647,  0.64456735]])

lambdas # 각각의 고유벡터는 그에 상응하는 고유값으로 람다 벡터에 저장됨
# array([ 1.37228132, -4.37228132])


# Av = 람다v 검증
v = V[:,0] 
v
# array([0.86011126, 0.51010647])

lambduh = lambdas[0] # note that "lambda" is reserved term in Python
lambduh
# 1.3722813232690143

Av = np.dot(A, v)
Av
# array([1.18031462, 0.70000958])

lambduh * v
# array([1.18031462, 0.70000958])


# plot_vectors()를 활용한 시각화
plot_vectors([Av, v], ['blue', 'lightblue'])
plt.xlim(-1, 2)
_ = plt.ylim(-1, 2)

 

 

# 3차원 고유벡터
X = np.array([[25, 2, 9], [5, 26, -5], [3, 7, -1]])
X
# array([[25,  2,  9],
#        [ 5, 26, -5],
#        [ 3,  7, -1]])

lambdas_X, V_X = np.linalg.eig(X) 
V_X # one eigenvector per column of X
# array([[-0.71175736, -0.6501921 , -0.34220476],
#        [-0.66652125,  0.74464056,  0.23789717],
#        [-0.22170001,  0.15086635,  0.90901091]])

lambdas_X # a corresponding eigenvalue for each eigenvector
# array([29.67623202, 20.62117365, -0.29740567])


# Xv = 람다v 검증
v_X = V_X[:,0] 
v_X
# array([-0.71175736, -0.66652125, -0.22170001])

lambda_X = lambdas_X[0] 
lambda_X
# 29.676232023948902

np.dot(X, v_X) # matrix multiplication
# array([-21.12227645, -19.77983919,  -6.5792208 ])

lambda_X * v_X
# array([-21.12227645, -19.77983919,  -6.5792208 ])

 

 

 

 

 

03. 계수와 고유값

 

  • 행렬 X의 계수 = X의 모든 고유값의 곱
    • 계수가 0이면 행렬 X가 특수행렬(역치되지 않음) 

 

 

 

 

 

04. 고유값 분해 Eigendecomposition

 

  • 행렬의 고유값을 분해하여 고유벡터로 표현한 경우 행렬의 특성을 나타냄
    • 함수의 최대치 = 고유값의 최대치
    • 함수의 최소치 = 고유값의 최소치

 

 

 

 

 

 

728x90