<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 행렬의 연산과 성질
행렬에는 곱셈, 전치 이외에도 지수 함수 등의 다양한 연산을 정의할 수 있다. 각각의 정의와 성질을 알아보자.
행렬의 부호
행렬은 복수의 실수 값을 가지고 있으므로 행렬 전체의 부호는 정의할 수 없다. 하지만 행렬에서도 실수의 부호 정의와 유사한 기능을 가지는 정의가 존재한다. 바로 행렬의 양-한정(positive definite) 특성이다.
모든 실수 공간 $\mathbb{R}^n$ 의 0벡터가 아닌 벡터 $x \in \mathbb{R}^n$ 에 대해 다음 부등식이 성립하면 행렬 $A$ 가 양-한정(positive definite)이라고 한다.
$$ x^T A x > 0 $$
만약 이 식이 등호를 포함한다면 양-반한정(positive semi-definite)이라고 한다.
$$ x^T A x \geq 0 $$
예를 들어 단위 행렬은 양-한정이다.
$$ x^TI x = x^T
\begin{bmatrix}
1&0&\cdots&0\
0&1&\cdots&0\
\vdots&\vdots&\ddots&\vdots\
0&0&\cdots&1\
\end{bmatrix}
x
= x_1^2 + x_2^2 + \cdots + x_n^2 > 0
$$
다음과 같은 행렬도 양-한정이다.
$$ M = \begin{bmatrix} 2&-1&0\-1&2&-1\0&-1&2 \end{bmatrix} $$
$$ 
\begin{align} 
x^{\mathrm{T}}M x 
&=  \begin{bmatrix} (2x_1-b)&(-x_1+2x_2-x_3)&(-x_2+2c) \end{bmatrix} \begin{bmatrix} x_1\x_2\x_3 \end{bmatrix} \
&= 2{x_1}^2 - 2x_1x_2 + 2{x_2}^2 - 2x_2x_3 + 2{x_3}^2 \
&= {x_1}^2+(x_1 - x_2)^{2} + (x_2 - x_3)^{2}+{x_3}^2
\end{align}
$$
행렬의 크기
행렬에는 크기 개념과 유사하게 하나의 행렬에 대해 하나의 실수를 대응시키는 norm, 대각 성분(trace), 행렬식(determinant)에 대한 정의가 존재한다.
행렬 Norm
행렬의 norm 정의는 다양하지만 그 중 많이 쓰이는 induced p-norm 정의는 다음과 같다.
$$ \Vert A \Vert_p = \left( \sum_{i=1}^m \sum_{j=1}^n |a_{ij}|^p \right)^{1/p} $$
이 중 $p=2$는 특별히 Frobenius norm 이라고 불리며 다음과 같이 표시한다.
$$ \Vert A \Vert_F = \sqrt{\sum_{i=1}^m \sum_{j=1}^n a_{ij}^2} $$
NumPy에서는 linalg 서브패키지의 norm 명령으로 Frobenious norm을 계산할 수 있다.
Step1:  대각 성분
대각 성분(trace) 행렬의 특성을 결정하는 숫자 중 하나로 정방 행렬(square matrix)에 대해서만 정의되며 다음과 같이 대각 성분(diaginal)의 합으로 계산된다.
$$ \operatorname{tr}(A) = a_{11} + a_{22} + \dots + a_{nn}=\sum_{i=1}^{n} a_{ii} $$
대각 성분은 다음과 같은 성질을 지닌다.
$$ \text{tr} (cA) = c\text{tr} (A) $$
$$ \text{tr} (A^T) = \text{tr} (A) $$
$$ \text{tr} (A + B) = \text{tr} (A) + \text{tr} (B)$$
$$ \text{tr} (AB) = \text{tr} (BA) $$
$$ \text{tr} (ABC) = \text{tr} (BCA) = \text{tr} (CAB) $$
특히 마지막 성질은 trace trick이라고 하여 이차 형식(quadratic form)의 값을 구하는데 유용하게 사용된다.
$$ x^TAx = \text{tr}(x^TAx) = \text{tr}(Axx^T)  = \text{tr}(xx^TA) $$
NumPy에서는 linalg 서브패키지의 trace 명령으로 trace를 계산할 수 있다. 
NumPy에서는 linalg 서브패키지의 trace 명령으로 trace를 계산할 수 있다.
Step2:  행렬식
정방 행렬 $A$의 행렬식(determinant) $\det (A)$ 는 Laplace formula라고 불리는 재귀적인 방법으로 정의된다. 
이 식에서 $a_{i,j}$는 $A$의 i행, j열 원소이고 $M_{i,j}$은 정방 행렬 $A$ 에서 i행과 j열을 지워서 얻어진 행렬의 행렬식이다.
$$ \det(A) = \sum_{j=1}^n (-1)^{i+j} a_{i,j} M_{i,j} $$
행렬식은 다음과 같은 성질을 만족한다.
$$ \det(I) = 1 $$
$$ \det(A^{\rm T}) = \det(A) $$
$$ \det(A^{-1}) = \frac{1}{\det(A)}=\det(A)^{-1} $$
$$ \det(AB) = \det(A)\det(B) $$
$$ A \in \mathbf{R}^n \;\;\; \rightarrow \;\;\; \det(cA) = c^n\det(A) $$
또한 역행렬은 행렬식과 다음과 같은 관계를 가진다. 
$$ A^{-1} = \dfrac{1}{\det A} M = \dfrac{1}{\det A} 
\begin{bmatrix}
M_{1,1}&\cdots&M_{1,n}\
\vdots&\ddots&\vdots\
M_{n,1}&\cdots&M_{n,n}\
\end{bmatrix}
$$
NumPy에서는 linalg 서브패키지의 det 명령으로 trace를 계산할 수 있다.
Step3:  전치 행렬과 대칭 행렬
전치 연산을 통해서 얻어진 행렬을 전치 행렬(transpose matrix)이라고 한다.
$$ [\mathbf{A}^\mathrm{T}]{ij} = [\mathbf{A}]{ji} $$ 
만약 전치 행렬과 원래의 행렬이 같으면 대칭 행렬(symmetric matrix)이라고 한다.
$$ A^\mathrm{T} = A $$ 
전치 연산은 다음과 같은 성질을 만족한다.
$$ ( A^\mathrm{T} ) ^\mathrm{T} = A  $$
$$ (A+B) ^\mathrm{T} = A^\mathrm{T} + B^\mathrm{T} $$
$$ \left( A B \right) ^\mathrm{T} = B^\mathrm{T} A^\mathrm{T}  $$
$$ \det(A^\mathrm{T}) = \det(A) $$
$$ (A^\mathrm{T})^{-1} = (A^{-1})^\mathrm{T} $$
지수 행렬
행렬 $A$에 대해 다음과 같은 급수로 만들어지는 행렬 $e^A=\exp A$ 를 지수 행렬(exponential matrix)이라고 한다.
$$ e^X = \sum_{k=0}^\infty \dfrac{X^k}{k!} = I + X + \dfrac{1}{2}X^2 + \dfrac{1}{3!}X^3 + \cdots $$ 
지수 행렬은 다음과 같은 성질을 만족한다.
$$ e^0 = I $$
$$ e^{aX} e^{bX} =  e^{(a+b)X} $$
$$ e^X e^{-X} = I $$
$$ XY = YX  \;\; \rightarrow \;\; e^Xe^Y = e^Ye^X = e^{X+Y} $$
로그 행렬
행렬 $A$에 대해 다음과 같은 급수로 만들어지는 행렬 $B=e^A$ 가 존재할 때, $A$를 $B$에 대한 로그 행렬이라고 하고 다음과 같이 표기한다.
$$ A = \log B $$
로그 행렬은 다음과 같은 성질은 만족한다.
만약 행렬 $A$, $B$가 모두 양-한정(positive definite)이고 $AB=BA$이면 
$$ AB = e^{\ln(A)+\ln(B)} $$
만약 행렬 $A$의 역행렬이 존재하면
$$ A^{-1} = e^{-\ln(A)} $$
지수 행렬이나 로그 행렬은 NumPy에서 계산할 수 없다. SciPy의 linalg 서브패키지의 expm, logm 명령을 사용한다.
<ASSISTANT_TASK:>
Python Code:
A = (np.arange(9) - 4).reshape((3, 3))
A
np.linalg.norm(A)
Explanation: 행렬의 연산과 성질
행렬에는 곱셈, 전치 이외에도 지수 함수 등의 다양한 연산을 정의할 수 있다. 각각의 정의와 성질을 알아보자.
행렬의 부호
행렬은 복수의 실수 값을 가지고 있으므로 행렬 전체의 부호는 정의할 수 없다. 하지만 행렬에서도 실수의 부호 정의와 유사한 기능을 가지는 정의가 존재한다. 바로 행렬의 양-한정(positive definite) 특성이다.
모든 실수 공간 $\mathbb{R}^n$ 의 0벡터가 아닌 벡터 $x \in \mathbb{R}^n$ 에 대해 다음 부등식이 성립하면 행렬 $A$ 가 양-한정(positive definite)이라고 한다.
$$ x^T A x > 0 $$
만약 이 식이 등호를 포함한다면 양-반한정(positive semi-definite)이라고 한다.
$$ x^T A x \geq 0 $$
예를 들어 단위 행렬은 양-한정이다.
$$ x^TI x = x^T
\begin{bmatrix}
1&0&\cdots&0\
0&1&\cdots&0\
\vdots&\vdots&\ddots&\vdots\
0&0&\cdots&1\
\end{bmatrix}
x
= x_1^2 + x_2^2 + \cdots + x_n^2 > 0
$$
다음과 같은 행렬도 양-한정이다.
$$ M = \begin{bmatrix} 2&-1&0\-1&2&-1\0&-1&2 \end{bmatrix} $$
$$ 
\begin{align} 
x^{\mathrm{T}}M x 
&=  \begin{bmatrix} (2x_1-b)&(-x_1+2x_2-x_3)&(-x_2+2c) \end{bmatrix} \begin{bmatrix} x_1\x_2\x_3 \end{bmatrix} \
&= 2{x_1}^2 - 2x_1x_2 + 2{x_2}^2 - 2x_2x_3 + 2{x_3}^2 \
&= {x_1}^2+(x_1 - x_2)^{2} + (x_2 - x_3)^{2}+{x_3}^2
\end{align}
$$
행렬의 크기
행렬에는 크기 개념과 유사하게 하나의 행렬에 대해 하나의 실수를 대응시키는 norm, 대각 성분(trace), 행렬식(determinant)에 대한 정의가 존재한다.
행렬 Norm
행렬의 norm 정의는 다양하지만 그 중 많이 쓰이는 induced p-norm 정의는 다음과 같다.
$$ \Vert A \Vert_p = \left( \sum_{i=1}^m \sum_{j=1}^n |a_{ij}|^p \right)^{1/p} $$
이 중 $p=2$는 특별히 Frobenius norm 이라고 불리며 다음과 같이 표시한다.
$$ \Vert A \Vert_F = \sqrt{\sum_{i=1}^m \sum_{j=1}^n a_{ij}^2} $$
NumPy에서는 linalg 서브패키지의 norm 명령으로 Frobenious norm을 계산할 수 있다.
End of explanation
np.trace(np.eye(3))
Explanation: 대각 성분
대각 성분(trace) 행렬의 특성을 결정하는 숫자 중 하나로 정방 행렬(square matrix)에 대해서만 정의되며 다음과 같이 대각 성분(diaginal)의 합으로 계산된다.
$$ \operatorname{tr}(A) = a_{11} + a_{22} + \dots + a_{nn}=\sum_{i=1}^{n} a_{ii} $$
대각 성분은 다음과 같은 성질을 지닌다.
$$ \text{tr} (cA) = c\text{tr} (A) $$
$$ \text{tr} (A^T) = \text{tr} (A) $$
$$ \text{tr} (A + B) = \text{tr} (A) + \text{tr} (B)$$
$$ \text{tr} (AB) = \text{tr} (BA) $$
$$ \text{tr} (ABC) = \text{tr} (BCA) = \text{tr} (CAB) $$
특히 마지막 성질은 trace trick이라고 하여 이차 형식(quadratic form)의 값을 구하는데 유용하게 사용된다.
$$ x^TAx = \text{tr}(x^TAx) = \text{tr}(Axx^T)  = \text{tr}(xx^TA) $$
NumPy에서는 linalg 서브패키지의 trace 명령으로 trace를 계산할 수 있다. 
NumPy에서는 linalg 서브패키지의 trace 명령으로 trace를 계산할 수 있다.
End of explanation
A = np.array([[1, 2], [3, 4]])
A
np.linalg.det(A)
Explanation: 행렬식
정방 행렬 $A$의 행렬식(determinant) $\det (A)$ 는 Laplace formula라고 불리는 재귀적인 방법으로 정의된다. 
이 식에서 $a_{i,j}$는 $A$의 i행, j열 원소이고 $M_{i,j}$은 정방 행렬 $A$ 에서 i행과 j열을 지워서 얻어진 행렬의 행렬식이다.
$$ \det(A) = \sum_{j=1}^n (-1)^{i+j} a_{i,j} M_{i,j} $$
행렬식은 다음과 같은 성질을 만족한다.
$$ \det(I) = 1 $$
$$ \det(A^{\rm T}) = \det(A) $$
$$ \det(A^{-1}) = \frac{1}{\det(A)}=\det(A)^{-1} $$
$$ \det(AB) = \det(A)\det(B) $$
$$ A \in \mathbf{R}^n \;\;\; \rightarrow \;\;\; \det(cA) = c^n\det(A) $$
또한 역행렬은 행렬식과 다음과 같은 관계를 가진다. 
$$ A^{-1} = \dfrac{1}{\det A} M = \dfrac{1}{\det A} 
\begin{bmatrix}
M_{1,1}&\cdots&M_{1,n}\
\vdots&\ddots&\vdots\
M_{n,1}&\cdots&M_{n,n}\
\end{bmatrix}
$$
NumPy에서는 linalg 서브패키지의 det 명령으로 trace를 계산할 수 있다.
End of explanation
A = np.array([[1.0, 3.0], [1.0, 4.0]])
A
B = sp.linalg.logm(A)
B
sp.linalg.expm(B)
Explanation: 전치 행렬과 대칭 행렬
전치 연산을 통해서 얻어진 행렬을 전치 행렬(transpose matrix)이라고 한다.
$$ [\mathbf{A}^\mathrm{T}]{ij} = [\mathbf{A}]{ji} $$ 
만약 전치 행렬과 원래의 행렬이 같으면 대칭 행렬(symmetric matrix)이라고 한다.
$$ A^\mathrm{T} = A $$ 
전치 연산은 다음과 같은 성질을 만족한다.
$$ ( A^\mathrm{T} ) ^\mathrm{T} = A  $$
$$ (A+B) ^\mathrm{T} = A^\mathrm{T} + B^\mathrm{T} $$
$$ \left( A B \right) ^\mathrm{T} = B^\mathrm{T} A^\mathrm{T}  $$
$$ \det(A^\mathrm{T}) = \det(A) $$
$$ (A^\mathrm{T})^{-1} = (A^{-1})^\mathrm{T} $$
지수 행렬
행렬 $A$에 대해 다음과 같은 급수로 만들어지는 행렬 $e^A=\exp A$ 를 지수 행렬(exponential matrix)이라고 한다.
$$ e^X = \sum_{k=0}^\infty \dfrac{X^k}{k!} = I + X + \dfrac{1}{2}X^2 + \dfrac{1}{3!}X^3 + \cdots $$ 
지수 행렬은 다음과 같은 성질을 만족한다.
$$ e^0 = I $$
$$ e^{aX} e^{bX} =  e^{(a+b)X} $$
$$ e^X e^{-X} = I $$
$$ XY = YX  \;\; \rightarrow \;\; e^Xe^Y = e^Ye^X = e^{X+Y} $$
로그 행렬
행렬 $A$에 대해 다음과 같은 급수로 만들어지는 행렬 $B=e^A$ 가 존재할 때, $A$를 $B$에 대한 로그 행렬이라고 하고 다음과 같이 표기한다.
$$ A = \log B $$
로그 행렬은 다음과 같은 성질은 만족한다.
만약 행렬 $A$, $B$가 모두 양-한정(positive definite)이고 $AB=BA$이면 
$$ AB = e^{\ln(A)+\ln(B)} $$
만약 행렬 $A$의 역행렬이 존재하면
$$ A^{-1} = e^{-\ln(A)} $$
지수 행렬이나 로그 행렬은 NumPy에서 계산할 수 없다. SciPy의 linalg 서브패키지의 expm, logm 명령을 사용한다.
End of explanation
<END_TASK>