기본 콘텐츠로 건너뛰기

[Linear Algebra] 직교적 투영(Orthogonal Projection)

[Linear Algebra] 고유벡터(Eigenvector)와 고유값(Eigenvalue)

고유벡터(Eigenvector)와 고유값(Eigenvalue)

고유 벡터(eigenvector)는 정방 행렬의 선형 변환이 일어난 후에도 방향이 변하지 않는 영벡터(zero vector)가 아닌 벡터들을 의미합니다. 즉, n차원 공간에서 임의의 벡터를 표현할 수 있는 기준이 되는 벡터인 기저(basis) 벡터를 의미합니다. 그러므로 행렬 A의 고유벡터 v 사이에는 식 1의 관계가 성립합니다.

Av = λv(식 1)
(A − λ)v = 0
조건) λ ≠ 0

식 1에서 A는 가역행렬이고 λ는 스칼라로서 고유값(eigenvalue)이라고 합니다.

예 1)

행렬 A와 두 벡터 u, v의 관계를 조사해 봅니다.

$$A=\begin{bmatrix}3&-2\\1&0\end{bmatrix}, \quad u=\begin{bmatrix}-1\\1\end{bmatrix}, \quad v=\begin{bmatrix}2\\1\end{bmatrix}$$

행렬 A와 미지의 벡터 x와 선형결합한 결과 벡터가 각각 u, v일 경우 선형독립인지를 결정합니다. 선형독립일 경우 A는 기저행렬이 됩니다.

A=np.array([[3,-2],[1,0]])
u=np.array([-1,1])
v=np.array([2,1])
Au=np.c_[A, u]
print(Au)
[[ 3 -2 -1]
 [ 1  0  1]]
Matrix(Au).rref()
(Matrix([
[1, 0, 1],
[0, 1, 2]]), 
(0, 1))
Av=np.c_[A, v]
print(Av)
[[ 3 -2  2]
 [ 1  0  1]]
Matrix(Av).rref()
(Matrix([
[1, 0,   1],
[0, 1, 1/2]]), 
(0, 1))

행렬 A와 벡터 u, v를 결합한 확대행렬 Au, Av의 기약행 사다리꼴 형태 (rref)을 검사한 결과는 A의 모든 열이 피봇열이므로 행렬 A의 급수(Rank)가 2임을 나타냅니다. 이 행렬의 급수는 numpy.linalg.matrix_rank()함수를 사용하여 확인할 수 있습니다.

la.matrix_rank(A)
2

위 두 선형결합 모두 독립이므로 고유한 해벡터를 가집니다.

u_sol=la.solve(A, u)
print(u_sol)
[1. 2.]
v_sol=la.solve(A,v)
print(v_sol)
[1.  0.5]

v_sol의 경우 벡터 v와 배수관계가 성립합니다. 즉, A와 v의 내적은 해와 배수 관계이므로 같은 방향을 나타냅니다. 그림 1은 A와 벡터 u, v의 내적에 관계된 객체들을 시각화 한것입니다.

print(A@u)
[-5 -1]
print(A@v)
[4 2]
그림 1. 표준 행렬과 두 벡터의 선형 결합.

그림 1에서 v와 Av는 비례관계이며 같은 방향을 가집니다. 그러므로 식 2와 같이 고유벡터와 고유값의 관계가 성립합니다.

Av = 2v(식 2)
(A − 2I)·v = 0, I: 항등행렬

식 2는 고유값 λ, 고유벡터 v로 표시하여 식 3와 같이 일반화 할 수 있습니다.

(A − λI)·v = 0, I: 항등행렬(식 3)

식 3은 (A - λI)와 고유벡터(v)와의 동차 선형결합 시스템이 되며 이 시스템의 표준행렬 즉 (A - λI)의 행렬식을 특성 방정식(characteristic equation)이라고 합니다(식 4).

특성방정식 = det(A - λI)(식 4)

예 2)

행렬 A의 고유값을 계산해 봅니다.

$$A=\begin{bmatrix}3& 4\\3& -1 \end{bmatrix}$$

행렬 A의 고유값을 a, 고유 벡터를 v라고 하면 식 3을 만족하여야 합니다. 즉, 식 5와 같이 선형결합이 성립해야 합니다.

$$\left(\begin{bmatrix}3& 4\\3& -1\end{bmatrix}-a\begin{bmatrix}1& 0\\0 & 1\end{bmatrix}\right)\begin{bmatrix}v_1 \\ v_2\end{bmatrix}=0$$(식 5)

고유벡터의 경우 동일한 방향을 가지는 다양한 벡터로 표현될 수 있으므로 고유값과 고유벡터는 유일한 값이 아닙니다. 즉, 식 5의 동차선형결합은 자명하지 않은 해를 가집니다. 이것은 이 식의 표준행렬의 역행렬이 존재하지 않음을 의미하므로 그 행렬의 행렬식은 0이 됩니다. det = 0 으로 부터 고유값 a를 결정할 수 있습니다.

미지수 a를 결정하기 위해 sympy 라이브러리의 symbols()를 비롯한 여러 함수들을 적용합니다.

a=symbols('a') 
A=Matrix([[3, 4],[3, -1]])
print(np.array(A))
[[3 4]
 [3 -1]]
I2=eye(2)
print(np.array(I2))
[[1 0]
 [0 1]]
# 특성식(=charEq) 
charEq=A-a*I2
print(charEq)
Matrix([[3 - a, 4], [3, -a - 1]])
# 특성식의 행렬식 
charEq_det=factor(det(charEq)) 
charEq_det
(a - 5)(a + 3)
#행렬식의 해 
solve(charEq_det)
[-3, 5]

특성방정식을 계산하는 과정에서 항등행렬을 생성하기 위해 sympy.eye()를 사용하였으며 미지수의 해는 sympy.solve() 함수를 사용하여 결정하였습니다.

결과로 고유값은 -3, 5입니다. 이 값을 기준으로 고유벡터는 다음의 선형결합의 해(solution) 벡터가 됩니다(식 6).

\begin{align}\begin{bmatrix}3& 4\\3& -1\end{bmatrix}\begin{bmatrix}v_{11}\\v_{21}\end{bmatrix}&=-3\begin{bmatrix}v_{11}\\v_{21}\end{bmatrix}\\ &\Rightarrow\left(\begin{bmatrix}3& 4\\3& -1\end{bmatrix}+3\begin{bmatrix}1& 0\\0 & 1\end{bmatrix}\right)\begin{bmatrix}v_{11}\\v_{21}\end{bmatrix}\\ &\Rightarrow\begin{bmatrix}6&4\\3&2\end{bmatrix}\begin{bmatrix}v_{11}\\v_{21}\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}\\ \begin{bmatrix}3& 4\\3& -1\end{bmatrix}\begin{bmatrix}v_{12}\\v_{22}\end{bmatrix}&=5\begin{bmatrix}v_{12}\\v_{22}\end{bmatrix}\\ &\Rightarrow\left(\begin{bmatrix}3& 4\\3& -1\end{bmatrix}-5\begin{bmatrix}1& 0\\0 & 1\end{bmatrix}\right)\begin{bmatrix}v_{12}\\v_{22}\end{bmatrix}\\ &\Rightarrow\begin{bmatrix}-2&4\\3&-6\end{bmatrix}\begin{bmatrix}v_{12}\\v_{22}\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}\end{align}(식 6)

고유벡터는 기저벡터입니다. 특성방정식은 가역행렬이므로 식 6의 각 선형결합은 자명하지 않은 해를 가집니다. 그러므로 고유벡터는 다양한 해 벡터들에서 기저벡터(들)을 의미합니다. 다시 말하면 해벡터들의 영공간(nullspace)이 고유벡터가 됩니다.

aug1=(A+3*I2).row_join(c)
aug1.rref()
c=Matrix([0,0])
aug1=(A+3*I2).
(Matrix([
 [1, 2/3, 0],
 [0,   0, 0]]),
 (0,))
aug2=(A-5*I2).row_join(c)
aug2.rref()
(Matrix([
 [1, -2, 0],
 [0,  0, 0]]),
 (0,))

위 각 시스템의 영공간은 다음과 같습니다. 영공간을 계산하기 위해 nullspace() 함수를 적용하였습니다.

(A+3*I2).nullspace()
[Matrix([
 [-2/3],
 [   1]])]
(A-5*I2).nullspace()
[Matrix([
 [2],
 [1]])]

위 결과를 정리하면 식 7과 같습니다.

\begin{align}\text{고유값}&=\{-3,\; 5\}\\\text{고유벡터}&=\left\{\begin{bmatrix} -\frac{2}{3}\\1.0\end{bmatrix},\; \begin{bmatrix}20\\1.0 \end{bmatrix}\right\} \end{align} (식 7)
고유벡터와 고유공간
  • n × n 차원의 정방행렬 A, 고유값(λ), 그리고 고유벡터(v)과 사이에 선형결합이 성립합니다(λ ≠ 0).
  • 특성식 A - λI은 비가역행렬로 행렬식은 0입니다.
  • 고유값에 대응하는 고유벡터는 특성식의 영공간(null space)입니다.
  • 그 영공간(null spaces)은 ℝn의 부분공간이며 λ에 대응하는 고유벡터로서 고유공간(eigen-space)이라고 합니다.

행렬 A의 고유값과 고유벡터들은 numpy.linalg.eig(x) 함수를 사용하여 확인할 수 있습니다. 이 함수의 인수 객체는 numpy 배열형이어야 하므로 np.array(객체, dtype=float) 함수를 사용하여 자료형을 변환해야 합니다. 또한 sympy의 eigenvals()eigenvects() 메소드를 적용할 수 있습니다.

print(np.array(A, dtype=float))
[[ 3.  4.]
 [ 3. -1.]]
eigVal, eigVec=la.eig(np.array(A, dtype=float)) 
print(eigVal)
[ 5. -3.]
print(eigVec)
[[ 0.89442719 -0.5547002 ]
 [ 0.4472136   0.83205029]]

eig()에 의한 고유 벡터들은 위에서 계산한 값과 차이를 보입니다. 그러나 두 결과의 차이는 서로 스칼라 배의 관계를 가지며 동일한 방향을 보입니다. 즉, 고유값 5에 대응하는 벡터 <0.89442719, 0.4472136>는 <2, 1>의 비례관계를 보입니다. 결과적으로 고유벡터는 동일한 방향을 보이는 것이므로 이 둘은 같은 결론을 이끌어 냅니다. 이에 반해 sympy의 eigvals(), eigvects()메소드에 대한 결과는 보다 직관적으로 나타냅니다.

A.eigenvals()
{5: 1, -3: 1}
A.eigenvects()
[(-3,
  1,
  [Matrix([
   [-2/3],
   [   1]])]),
 (5,
  1,
  [Matrix([
   [2],
   [1]])])]

이 블로그의 인기 게시물

유사변환과 대각화

내용 유사변환 유사행렬의 특성 대각화(Diagonalization) 유사변환(Similarity transformation) 유사변환 n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사하다고 하며 이 변환을 유사 변환 (similarity transformation)이라고 합니다. $$\begin{equation}\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B \end{equation}$$ 식 1의 유사 변환은 다음과 같이 고유값을 적용하여 특성 방정식 형태로 정리할 수 있습니다. $$\begin{align} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align}$$ 위 식의 행렬식은 다음과 같이 정리됩니다. $$\begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \t

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b