기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

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

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

관련된 내용

예 1)

행렬 A의 특성 방정식과 고유값을 계산해봅니다.

$$ \left[\begin{matrix}1 & 3 & -1.5\\9 & - \frac{27}{2} & 4.5\\7 & - \frac{39}{2} & \frac{15}{2}\end{matrix}\right]$$

행렬 A의 고유값 r을 가정하여 표현한 특성방정식(det(A − λI))은 다음과 같습니다.

다음 코드의 sympy.rational() 함수를 분수를 표시하기 위해 적용한 것입니다.

r=symbols('r', real=True) 
A=Matrix([[1, 3, -1.5],[9, -Rational("27/2"), 4.5],[7, -Rational("39/2"), Rational("15/2")]]) 
cheqM=A-r*eye(3) 
cheqM 

$\left[\begin{matrix}1 - r & 3 & -1.5\\9 & - r - \frac{27}{2} & 4.5\\7 & - \frac{39}{2} & \frac{15}{2} - r\end{matrix}\right]$

cheq=det(cheqM)#특성방정식 
expand(cheq)
-r3 - 5r2 +36.0r
sol=solve(cheq, r)
[sp.N(i, 3) for i in sol]
[-9.00, 0, 4.00]

numpy.linalg.eigvals()함수를 사용하여 고유값을 확인해 봅니다.

eigVal=la.eigvals(np.array(A, dtype=float))
print(np.around(eigVal, 3))
[-9.  4. -0.]

예 2)

행렬 A에 대해 벡터 v가 고유 벡터인지를 결정해 봅니다.

$$A=\begin{bmatrix}1.5& 9\\1.0& -3.0\end{bmatrix},\quad v=\begin{bmatrix}-6\\ -1\end{bmatrix}$$

v가 A의 고유 벡터라면 식 1에 의해 고유값을 결정할 수 있습니다. 먼저 고유값을 결정하면 다음과 같습니다.

\begin{align}Av & = λv\\(A − λ)v &= 0\\\text{조건)}&\; λ ≠ 0\end{align}(식 1)
l=symbols('lamda') 
A=Matrix([[1.5, 9],[1,-3]]) 
v=Matrix([[-6],[-1]]) 
cheM=A-l*eye(2) 
cheM

$\left[\begin{matrix}1.5 - \lambda & 9\\1 & - \lambda - 3\end{matrix}\right]$

eig_val=solve(det(cheM), l)
print(np.array(eig_val, dtype=float).round(3))
[-4.5  3. ]

벡터 v에 대응하는 고유값을 결정하기 위해서는 Av = λv를 적용합니다.

print(A*v ==eig_val[0]* v)
print(A*v ==eig_val[1]* v)
False
True

벡터 v에 대응하는 고유값은 3입니다. np.linalg.eig() 함수를 적용하여 고유값과 고유벡터를 확인해 봅니다.

eig_val, eig_vec=la.eig(np.array(A, dtype=float))
print(eig_val)
[ 3.  -4.5]
print(eig_vec.round(3))
[[ 0.986 -0.832]
 [ 0.164  0.555]]

위 결과는 고유값 3에 대응하는 고유벡터는 벡터 v와는 다른 값입니다. 그러나 이 둘은 스칼라배의 관계를 가집니다.

v=np.array(v, dtype=float)
x=v[0]/eig_vec[0,0]
x
array([-6.08276253])
np.allclose(v, x*eig_vec[:,0].reshape(-1,1))
True

예 3)

행렬 A에 대해 고유 벡터는 v인지를 결정합니다.

$$A=\begin{bmatrix}1& 6\\ 4& 2\end{bmatrix},\quad v=\begin{bmatrix}0\\0\end{bmatrix}$$

정의상 0벡터는 고유벡터가 될 수 없습니다.

예 4)

예 3의 행렬 A의 고유값이 7인 경우 고유벡터를 결정해 봅니다.

이 문제는 식 2와 같이 행렬 A와 고유값 7 사이의 특성 방정식 A - 7·I에 대한 선형결합이 성립하는지의 여부를 결정하는 것입니다.

\begin{align}A=\begin{bmatrix}1& 6\\ 4& 2\end{bmatrix}& \Rightarrow \begin{bmatrix}1& 6\\ 4& 2\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=7\begin{bmatrix}x_1\\x_2\end{bmatrix} \\ &\Rightarrow \left(\begin{bmatrix}1& 6\\ 4& 2\end{bmatrix}-7\begin{bmatrix}1& 0\\0 & 1\end{bmatrix} \right)\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}\\ &\Rightarrow \begin{bmatrix}-6& 6\\5 & -5\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}0\\0\end{bmatrix}\end{align} (식 2)
A=np.array([[1,6],[5,2]])
i7=7*np.eye(2)
c=np.zeros([2,1])
Ai7=A-i7
print(Ai7)
[[-6.  6.]
[ 5. -5.]]
Matrix(np.hstack([Ai7, c])).rref()
(Matrix([
[1, -1.0, 0],
[0,    0, 0]]),
(0,))

특성방정식의 기약행 사다리꼴 형태 (rref)는 한 개의 피벗 열과 한 개의 자유 변수로 구성되며 자유변수에 의해 다양한 해를 가집니다. 다양한 해들의 영공간이 고유값 7에 대응하는 고유벡터가 됩니다.

Matrix(Ai7).nullspace()
[Matrix([
[1.0],
[  1]])]

numpy.linalg.eig() 함수를 사용하여 고유 벡터를 계산해보면 다음과 같습니다.

eigVal, eigVec=la.eig(A)
eigVal
array([-4.,  7.])
print(eigVec.round(3))
[[-0.768 -0.707]
 [ 0.64  -0.707]]

식 1의 성립여부를 확인합니다.

np.isclose(A@eigVec[:,1], eigVal[1]*eigVec[:,1])
array([ True,  True])

예 5)

행렬 A에 대해 고유값 2에서의 고유공간을 결정하고 A와 벡터 c와의 선형결합이 독립 또는 종속임을을 결정합니다.

$$A=\begin{bmatrix}4& -1& 6\\2& 1& 6\\2& -1& 8\end{bmatrix},\quad c=\begin{bmatrix}0\\0\\0\end{bmatrix}$$

다음은 행렬 A에 대한 고유값과 고유벡터입니다. 이 결과에 의하면 고유값 2에 대응하는 고유 벡터는 2개입니다.

A=np.array([[4,-1,6], [2,1,6], [2,-1,8]])
print(A)
[[ 4 -1  6]
 [ 2  1  6]
 [ 2 -1  8]]
eigVal, eigVec=la.eig(A) 
print(np.around(eigVal, 3))
[9. 2. 2.]
print(eigVec.round(3))
[[-0.577 -0.633  0.133]
 [-0.577 -0.77  -0.969]
 [-0.577  0.083 -0.206]]

고유벡터는 원시행렬의 기저벡터로 구성됩니다. 그러므로 고유공간의 열벡터 수와 원시행렬의 급수는 같습니다.

la.matrix_rank(A)
3

위 결과는 행렬 A가 기저행렬임을 나타내는 것으로서 Ax = c가 선형독립임을 의미합니다. 이것은 A와 c의 확대행렬에 대한 rref로서 확인할 수 있습니다.

c=np.array([0,0,0])
Ac=np.c_[A, c]
print(Ac)
[[ 4 -1  6  0]
 [ 2  1  6  0]
 [ 2 -1  8  0]]
Matrix(Ac).rref()
(Matrix([
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]),
(0, 1, 2))

예 6)

행렬 A의 고유값들은 [-2, 2, 3]입니다. 이 값들에 대응하는 각 고유벡터를 결정하고 A가 기저행렬임을 결정합니다.

$$A=\begin{bmatrix}-6&-2& 6\\-8&-1&7\\-8& -4& 10\end{bmatrix}$$

A=np.array([[-6,-2, 6], [-8,-1,7], [-8, -4, 10]])
print(A)
[[-6 -2  6]
 [-8 -1  7]
 [-8 -4 10]]
eigVal, eigVec=la.eig(A)
print(eigVal)
[-2.  2.  3.]
print(np.around(eigVec, 3))
[[-0.577  0.333  0.371]
[-0.577  0.667  0.557]
[-0.577  0.667  0.743]]

위 고유행렬의 3개의 열벡터로 구성됩니다. 즉, 행렬 A는 기저행렬임을 의미합니다.

la.matrix_rank(A)
3
고유벡터
  • 고유 공간을 구성하는 고유 벡터들은 모두 기저 벡터들 입니다.
  • 고유벡터의 수는 원시행렬의 급수를 나타냅니다.
  • 그 고유 벡터들(v1, v2, …, vr)에 의한 선형결합은 선형독립입니다.

예 7)

다음 행렬의 고유값과 고유벡터를 결정해 봅니다.

$$A=\begin{bmatrix}3&6&-8\\0&0&6\\0&0&2\end{bmatrix}$$

A=np.array([[3,6,-8],[0,0,6],[0,0,2]])
  print(A)
[[ 3  6 -8]
 [ 0  0  6]
 [ 0  0  2]]
la.matrix_rank(A)
2

행렬 A의 급수는 2이므로 1개의 자유변수가 존재합니다. 그러므로 존재하는 고유벡터들 중 기저는 2개가 됩니다. 이 기저벡터에 대응하는 행렬 A의 벡터는 열공간(columnsapce)으로 나타낼 수 있습니다.

eigVal, eigVec=la.eig(A)
print(eigVal)
[3., 0., 2.]
print(np.around(eigVec, 3))
[[ 1.    -0.894 -0.953]
 [ 0.     0.447  0.286]
 [ 0.     0.     0.095]]
print(Matrix(A).columnspace())
[Matrix([
  [3],
  [0],
  [0]]), Matrix([
  [-8],
  [ 6],
  [ 2]])]

위 결과는 고유값 3개에 대한 고유벡터 역시 3개이지만 열공간에 의하면 기저 벡터는 2개 입니다. 이러한 차이는 고유값 0인 경우에서 발생합니다. 즉, 고유값 또는 고유벡터는 0 또는 0벡터가 아닙니다.

식 3과 같이 고유값이 0인 경우 A의 선형결합은 선형 독립 또는 선형 종속의 모든 가능성을 가집니다. 위 결합이 선형종속이면 고유값과 고유벡터가 가역행렬로부터 계산된다는 정의에 위배 됩니다. 또한 선형독립이면 그 행렬에 관계된 특성방정식이 존재하지 않습니다. 그러므로 고유벡터 역시 존재할 수 없습니다.

A·x = 0x → A·x = 0 (식 3)

다음과 같이 정리됩니다.

고유값의 수
  • 원시행렬의 열공간의 수
  • = 원시행렬의 급수(rank)
  • = 0이 아닌 고유값의 수

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \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)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[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