기본 콘텐츠로 건너뛰기

통계관련 함수와 메서드 사전

A B C d E F G H I K L M N O P Q R S T U V W Z A statsmodels.ap.stats.anova_lm(x) statsmodels.formula.api.ols 에 의해 생성되는 모형 즉, 클래스 인스턴스(x)를 인수로 받아 anova를 실행합니다. np.argsort(x, axis=-1, kind=None) 객체 x를 정렬할 경우 각 값에 대응하는 인덱스를 반환합니다. Axis는 기준 축을 지정하기 위한 매개변수로서 정렬의 방향을 조정할 수 있음(-1은 기본값으로 마지막 축) pandas.Series.autocorr(lag=1) lag에 전달한 지연수에 따른 값들 사이의 자기상관을 계산 B scipy.stats.bernoulli(x, p) 베르누이분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 p: 단일 시행에서의 확률 scipy.stats.binom(x, n, p) 이항분포에 관련된 통계량을 계산하기 위한 클래스를 생성합니다. x: 랜덤변수 n: 총 시행횟수 p: 단일 시행에서의 확률 C scipy.stats.chi2.pdf(x, df, loc=0, scale=1) 카이제곱분포의 확률밀도함수를 계산 $$f(x, k) =\frac{1}{2^{\frac{k}{2}−1}Γ(\frac{k}{2})}x^{k−1}\exp\left(−\frac{x^2}{2}\right)$$ x: 확률변수 df: 자유도 pd.concat(objs, axis=0, join=’outer’, …) 두 개이상의 객체를 결합한 새로운 객체를 반환. objs: Series, DataFrame 객체. Axis=0은 행단위 즉, 열 방향으로 결합, Axis=1은 열단위 즉, 행 방향으

벡터 연산

내용

벡터 연산

노름과 단위벡터(Norm and Unit Vector)

식 1과 같이 벡터들 사이에서 계산된 거리(D)를 norm(노름) 또는 유클리드 거리(Euclidean distance)라 하고 $\parallel{x}\parallel$로 나타냅니다.

$$\begin{equation}\tag{1}\text{D}=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2+\cdots}\end{equation}$$

예를 들어 x, y, z 축을 가지는 3차원의 벡터 a의 크기(노름, norm)는 벡터 b를 기준으로 식 2와 같이 계산됩니다. $$a=\begin{bmatrix} a_1\\a_2\\a_3\end{bmatrix}, \quad \ b=\begin{bmatrix} b_1\\b_2\\b_3\end{bmatrix}$$ $$\begin{equation}\tag{2}\parallel{x}\parallel=\sqrt{(a_1-b_1)^2+(a_2-b_2)^2+(a_3-b_3)^2}\end{equation}$$

물론 시점을 명시하지 않을 경우는 원점(0,0,0)으로 간주합니다. 노름 계산을 위해 np.linalg.norm(x) 함수를 사용할 수 있습니다. 이 함수는 numpy의 하위 모듈인 linalg에 포함된 함수이므로 아래 코드와 같이 numpy.linalg를 장착(import)하여 사용합니다. 또한 결과를 소수점 이하의 일정한 자리에서 반올림으로 나타내기 위해 np.around()함수를 적용하였습니다.

import numpy as np
import numpy.linalg as la 
import pandas as pd
import sympy as sp
import matplotlib.pyplot as plt
np.around(la.norm([[5.0],[3.0],[7.0]]),3)
9.11
np.around(np.sqrt((5-0)**2+(3-0)**2+(7-0)**2), 3)
9.11

단위벡터(unit vector)는 노름이 1인 벡터로서 식 3과 같이 계산할 수 있습니다.

$$\begin{align} a&=\begin{bmatrix} a_1& a_2 \end{bmatrix}\\ \tag{2} \text{unit vector of a}&=\left[\frac{a_1}{\parallel{a}\parallel}, \; \frac{a_2}{\parallel{a}\parallel}\right] \end{align}$$
a=np.array([[2],[7]]) 
a_norm=la.norm(a) 
a_unit=a/a_norm 
np.around(a_unit, 3) 
array([[0.275],
           [0.962]])
la.norm(a_unit)
1.0

예)
 벡터의 u와 같은 방향의 단위벡터?

u=np.array([[-4],[-5],[-4]]) 
u
array([[-4],
           [-5],
           [-4]])
uNorm=la.norm(u) 
np.around(uNorm, 3) 
7.55
uUnit=u/uNorm 
np.around(uUnit, 3)
array([[-0.53 ],
           [-0.662],
           [-0.53 ]])

행렬노름

행렬은 1개 이상의 행과 열로 구성된 배열이므로 두 벡터간의 거리를 사용하여 계산되는 벡터노름을 직접적으로 적용할 수 없습니다. 대신에 Ax=b가 성립되는 벡터 x와 그 행렬과의 행렬곱에 의한 결과로 행렬노름을 다음과 같이 정의합니다.

$$\begin{equation}\tag{Matrix Norm}\|A\|=\underset{x \neq 0}{\text{max}}\frac{\|Ax\|}{\|x\|} \Rightarrow \|Ax\| \leq \|A\|\|x\|\end{equation}$$

식 Matrix Norm은 1차 노름이며 이를 일반화하기 위해 다음과 같이 p-norm으로 나타냅니다.

$$\begin{equation}\tag{Matrix pNorm}\|A\|_p=\underset{x \neq 0}{\text{max}}\frac{\|Ax\|_p}{\|x\|_p} \Rightarrow \|Ax\|_p \leq \|A\|_p\|x\|_p\end{equation}$$

행렬 노름 역시 la.norm(객체, ord, axis=None)로 계산할 수 있습니다. 인수 ord는 위 식 Matrix pNorm의 p를 나타내는 것으로서 다양한 옵션이 존재합니다.

a = np.array([[1, 0, -1], [0, 1, 0], [1, 0, 1]]);a
array([[ 1,  0, -1],
       [ 0,  1,  0],
       [ 1,  0,  1]])
la.norm(a, 'fro')
2.23606797749979
la.norm(a, axis=0)#축을 지정하면 각 벡터 노름이 계산
array([1.41421356, 1.        , 1.41421356])

조건수(Condition Number)

조건수는 다중항들에 대한 영향을 나타냅니다. 예를 들어 y=f(x)의 함수에서 x의 변화률에 따른 y의 변화률을 나타내는 수로서 함수의 민감도를 측정하는 지표입니다. 행렬A와 벡터b 사이에 다음과 같은 선형결합이 성립할 경우 b의 변화로 x가 변화함을 알 수 있습니다.

$$Ax=b \rightarrow A(x+\Delta x)=b+\Delta b$$

위 행렬노름을 선형결합에 적용하면 다음과 같이 나타낼 수 있습니다.

$$\begin{align}\tag{cond_1}&b=Ax \Rightarrow \|b\| \leq \|A\| \|x\|\\& \Delta x = A^{-1}\Delta b \Rightarrow \|\Delta x\| \leq \|A^{-1}\| \|\Delta b\| \end{align}$$

위 식 cond_1의 위항과 아래항을 다음과 변화율로 나타낼 수 있습니다.

$$\begin{equation}\tag{cond_2}\frac{\|\Delta x\|}{\|A\| \|x\|} \leq \frac{\|A^{-1}\| \|\Delta b\|}{\|b\|} \Rightarrow \frac{\|\Delta x\|}{\|x\|} \leq \color{red}{\|A^{-1}\| \|A\|} \frac{\|\Delta b\|}{\|b\|}\end{equation}$$

A-1은 A의 역행렬입니다.

위 식 cond_2의 빨간색으로 표시한 부분이 행렬 A의 조건수(condition number)이며 cond(A)로 나타냅니다.

$$\begin{equation}\tag{con Num}\text{cond (A)}=\|A^{-1}\| \|A\|\end{equation}$$

식 con Num에 의한 조건수는 numpy.linalg.cond() 함수로도 계산됩니다.

a = np.array([[1, 0, -1], [0, 1, 0], [1, 0, 1]]);a
array([[ 1,  0, -1],
       [ 0,  1,  0],
       [ 1,  0,  1]])
aInv=la.inv(a);aInv
array([[ 0.5,  0. ,  0.5],
       [ 0. ,  1. ,  0. ],
       [-0.5,  0. ,  0.5]])
conNum=la.norm(aInv, 'fro')*la.norm(a, 'fro'); conNum
3.1622776601683795
la.cond(a, 'fro')
3.1622776601683795

벡터들의 연산

덧셈과 뺄셈, 그리고 스칼라 배

벡터의 연산은 동일한 형태를 가진 객체들 사이에서 성립합니다. numpy 배열 객체의 요소들의 위치는 0부터 시작하는 양의 정수로 자동으로 부여되는데 이를 인덱스(index)라고 합니다. 즉, 동일한 인덱스가 존재할 경우에만 연산이 이루어집니다.

a=np.array([10,15]) 
b=np.array([8,2]) 
c=np.array([1,2,3]) 
abSum=a+b
abSum
array([18, 17])
abSub=a-b; abSub
array([ 2, 13])
a-c
 ---------------------------------------------------------------------------
ValueError: operands could not be broadcast together with shapes (2,) (3,) 

위 코드에서 객체 a와 c는 형태가 다르므로 연산이 이루어지지 않습니다. a와 b의 연산은 그림 1과 같이 나타낼 수 있습니다.

plt.figure(dpi=100)
idx=[a, b, -b, abSum, abSub]
nme=["a", "b", "-b", "a+b", "a-b"]
col=['green', 'black', 'gray', 'blue', 'red']
for i, j in enumerate(idx):
    plt.arrow(0, 0, j[0], j[1], width=0.1, color=col[i], label=nme[i])
plt.arrow(-b[0], -b[1], abSub[0]+b[0],abSub[1]+b[1], linestyle='--', color="red", alpha=0.3) 
plt.arrow(abSub[0],abSub[1], a[0]-abSub[0],a[1]-abSub[1], linestyle='--', color="red", alpha=0.3)
plt.arrow(a[0],a[1], abSum[0]-a[0], abSum[1]-a[1], linestyle='--', color="blue", alpha=0.3)
plt.arrow(b[0],b[1], abSum[0]-b[0], abSum[1]-b[1], linestyle='--', color="blue", alpha=0.3)
plt.legend(loc="upper left")
plt.show()
그림 1. 두 벡터의 덧셈과 뺄셈.

두 벡터의 덧셈 연산은 그들이 생성할 수 있는 평행사변형의 대각선에 대응하는 벡터와 같습니다. 뺄셈 역시 a+(-b)와 같이 b에 스칼라 -1을 곱한 결과로 덧셈 연산과 같습니다. 그러므로 그림 1에서 나타낸 것과 같이 뻴셈의 결과는 벡터 a와 벡터 -b와의 평행사변형의 대각선을 표현하는 벡터와 같습니다.

식 3에서 나타낸 것과 같이 벡터 u, v, w 그리고 두 개의 스칼라인 a, b 사이에 연산 법칙을 정의될 수 있습니다.

$$\begin{align}\tag{3} &u+v = v+u\\ &u+(v+w) =(v+u)+w\\ &u+0 = u\\ &1·u = u\\ &a·(v+w) = a·v+a·w\\ &(a+b)·v = a·v + b·v \end{align}$$

내적(Inner product)

a, b 두 벡터의 내적(inner product, dot product)은 식 4와 같이 정의합니다.

$$\begin{align}a=\begin{bmatrix}a_1\\a_2 \end{bmatrix}, \quad b= \begin{bmatrix}b_1\\b_2 \end{bmatrix}\\ \tag{4} a · b = a_1×b_1 + a_2×b_2 \end{align}$$

내적의 계산은 다음과 같이 앞 벡터의 행방향과 뒤 벡터의 열방향으로 벡터간의 곱으로 나타낼 수 있습니다.

$$\begin{bmatrix} a_{11}&a_{12} \end{bmatrix} \begin{bmatrix} b_{11} \\ b_{21} \end{bmatrix}=a_{11}b_{11}+a_{12}b_{21}$$

위에서 a11은 1행 1열에 위치하는 요소(element) 또는 값을 나타내는 것으로 그 값의 인덱스는 [0,0]이 됩니다. 파이썬 프로그램에서 인덱스는 0부터 시작하므로 [1,1] 대신에 [0,0]이 됩니다. 즉, 2차원인 행렬의 경우 인덱스는 [행, 열]로 표시합니다. 그러나 numpy.array()함수에 의해 생성되는 벡터인 경우 1차원이므로 각 요소의 위치 값 하나만 표시됩니다. 예를 들어 다음 코드는 행렬 A의 경우와 벡터 a의 각 값(요소)들을 나타내기 위한 인덱스를 적용한 것입니다.

a=np.array([1,2,3])
print(f'a의 형태: {a.shape}, 0번째 요소: {a[0]}')
a의 형태: (3,), 0번째 요소: 1
A=np.array([[1,2],[3,4]]) 
print(f'A의 형태: {A.shape}, 0번째 요소: {A[0, 0]}')
A의 형태: (2, 2), 0번째 요소: 1

위 두 벡터의 곱 연산은 앞 객체의 행과 뒤 객체의 열의 사이에서 연산이 이루어집니다. 그러므로 앞 벡터 열의 수와 뒤 벡터 행의 수가 같아야 합니다. 내적을 위한 이 방법은 행렬들 사이에서 동일하게 적용되며 행렬곱(matrix product)이라고 합니다. 행렬곱 연산의 각 객체의 차원은 다음과 같습니다.

(r1 × c1) · (r2 × c2)=(r1 × c2)

위 식에서 r1와 r2은 행렬 1과 2의 행의 수, c1, c2는 행렬 1과 2의 열의 수를 나타냅니다.

위의 연산에서 c1 = r2의 조건은 충족되어야 합니다.

행렬곱은 numpy.dot(x, y) 함수로 계산합니다.

a=np.array([[1,2]])
b=np.array([[1],[2]])
print(f'a의 형태: {a.shape}, b의 형태: {b.shape}')
a의 형태: (1, 2), b의 형태: (2, 1)
a[0,0]*b[0,0]+a[0,1]*b[1,0]
5
np.dot(a, b)
array([[5]])

두 벡터 a,b 가 동일한 구조일 경우 벡터의 행과 열을 교환하는 방식으로 형태를 전환하여야 합니다. 이 결과는 그림 2와 같이 나타낼 수 있으며 벡터의 전치(transpose)라고 합니다.

그림 2. 벡터의 전치 과정.

그림 2와 같은 객체의 전치는 객체.T 메소드 또는 np.transpose() 함수를 사용합니다. 예를 들어 다음 a, b 두 벡터의 내적을 계산해 봅니다. 두 벡터는 모두 열벡터입니다.

a=np.array([[2],[7]]) 
b=np.array([[5],[2]]) 
a, b
(array([[2],
            [7]]),
     array([[5],
            [2]]))

두 벡터는 모두 열벡터로서 동일한 형태를 가집니다.

a.shape==b.shape 
True

벡터의 열과 다른 벡터의 행의 수를 같게 하기 위해 하나의 벡터를 전치시킬 필요가 있습니다. 또한 내적은 벡터의 특성을 나타내는 스칼라 값이기 때문에 앞 벡터가 행벡터로 전환되어야 합니다.

at=a.T ; at
array([[2, 7]])
np.transpose(a)
array([[2, 7]])
print(f'a의 형태: {a.shape}, at의 형태: {at.shape}')
a의 형태: (2, 1), at의 형태: (1, 2)

a의 전치 벡터 at과 b의 내적은 다음과 같습니다.

innerP=np.dot(at, b) 
innerP 
array([[24]])

예)
  다음 두 벡터에 대해 u · u, v · u를 계산해 봅니다.

$$u=\begin{bmatrix}-3\\8\end{bmatrix}\qquad v=\begin{bmatrix}7\\3\end{bmatrix}$$
u=np.array([[-3],[8]]) 
v=np.array([[7],[3]]) 
uu=np.dot(u.T, u) 
vu=np.dot(v.T, u) 
uu 
array([[73]])
vu
array([[3]])

내적은 식 5와 같이 두 벡터의 사잇각을 적용하여 계산할 수 있습니다. 역으로 두 벡터 u, v 사이의 각은 각 벡터의 길이와 내적을 사용하여 계산할 수 있습니다.

$$\begin{align}\tag{5} \displaystyle u \cdot v &=\parallel{u}\parallel \parallel{v}\parallel cos(\theta)\\ cos(\theta)&=\frac{u \cdot v}{\parallel{u}\parallel \parallel{v}\parallel} \end{align}$$

그림 3은 두 벡터 a, b의 사이각 θ를 나타낸 것입니다.

그림 3. 두 벡터의 사이각과 내적.

식 6과 같이 내적은 벡터 a의 길이와 그 위로 투영된 벡터 b의 길이와의 곱을 의미합니다.

$$\begin{align}\tag{6} a&=\parallel{b}\parallel cos(\theta)=\overline{OC}\\ b \cdot a &= \parallel{b}\parallel \parallel{b}\parallel cos(\theta) \end{align}$$

위 계산은 np.cos(), np.radians(), la.norm()등의 numpy함수들을 사용하여 다음과 같이 진행됩니다.

theta=52.25 
rad=np.radians(theta) 
np.around(rad, 4) 
0.9119
inner=np.round(la.norm(a)*la.norm(b)*np.cos(rad), 0) 
np.around(inner, 4)
24.0

cos(), sin() 등과 같은 numpy 라이브러리에서 제공하는 삼각함수에 전달하는 인수는 라디안(radian)이어야 합니다. 그러므로 np.radians()를 적용하여 각(degree)을 라디안으로 변환하였습니다.

예)
 벡터 a, b 사이에 사잇각을 계산합니다.

$$a=\displaystyle \left[\begin{matrix}-2\\1\end{matrix}\right] \qquad b= \left[\begin{matrix}-3\\1\end{matrix}\right]$$
a=np.array([[-2],[1]]) 
b=np.array([[-3],[1]]) 
# inner product between a and b 
ab=np.dot(a.T, b)  
ab 
array([[7]])
# norm of a 
aNorm=la.norm(a)  
np.around(aNorm,3) 
2.236
bNorm=la.norm(b)  
np.around(bNorm, 3) 
3.162
cos=ab/(aNorm*bNorm) 
np.around(cos, 3)
array([[0.99]])

위 결과는 cos(θ)=0.99를 나타낸 것입니다. 이 예의 질문은 θ이므로 cos()의 역함수 cos-1()(arccos())를 사용하여 이 값을 결정할 수 있습니다. 즉,

$$\begin{align}&y=\cos(\theta)\\&\cos^{-1}(y)=\theta \end{align}$$

cos()의 역함수는 numpy.arccos()로 계산합니다.

rad=np.arccos(cos) 
np.around(rad, 3) 
array([[0.142]])

위 결과는 radian 형식이므로 이 값을 degree로 전환하기 위해 numpy.rad2deg() 함수를 사용합니다.

deg=np.rad2deg(rad) 
np.around(deg, 3) 
array([[8.13]])

코쉬-슈바르츠 부등식 (Cauchy-Schwarz inequality)

벡터의 내적과 노름(norm)을 사용하여 식 7과 같이 부등식의 관계를 정의할 수 있습니다. 즉, 임의의 두 벡터에 대해 내적은 각 벡터의 노름(norm)의 곱보다 작거나 같습니다.

$$\begin{equation}\tag{7} |uv| \le \parallel{uv}\parallel \end{equation}$$

식 7에서 등호는 두 벡터가 서로 배수일 경우에 성립됩니다.

u=np.array([[-1], [2]])
v=np.array([[4], [-2]])
inner=np.dot(u.T, v)
abs(inner)
array([[8]])
normProd=la.norm(u)*la.norm(v)
np.around(normProd,3)
10.0

삼각부등식(Triangle inequality)

임의의 두 벡터에 대해 식 8과 같은 부등식이 성립됩니다. 즉, 두 벡터 합의 놈은 각 벡터 놈의 합보다 작거나 같습니다.

$$\begin{equation}\tag{8} \parallel{u+v}\parallel \le \parallel{u}\parallel \parallel{v}\parallel \end{equation}$$

식 8의 양변을 제곱하여 정리하면 식 7의 코쉬-슈바르츠 부등식이 유도됩니다.

$$\begin{align} &\parallel{u+v}\parallel^2 \le \left(\parallel{u}\parallel + \parallel{v}\parallel\right)^2\\ &\parallel{u}\parallel^2+\parallel{v}\parallel^2+2\parallel{u+v}\parallel \le \parallel{u}\parallel^2+\parallel{v}\parallel^2+2\parallel{u}\parallel \parallel{u}\parallel\\ &\parallel{uv}\parallel \le \parallel{u}\parallel \parallel{v}\parallel \end{align}$$

위에서 생성한 벡터 u, v를 사용하여 식 8을 확인하여 봅니다.

uvNorm=la.norm(u+v)
uvNorm
3.0
uvNorm2=la.norm(u)+la.norm(v)
np.around(uvNorm2, 3)
6.708

외적(Outer product)

임의의 두 벡터들과 수직인 벡터는 외적에 의해 산출됩니다. 3차원의 두 벡터 a, b의 외적은 식 9와 같이 산출합니다.

$$\begin{align}a=\begin{bmatrix}a_1\\a_2\\a_3\end{bmatrix} \quad b=\begin{bmatrix}b_1\\b_2\\b_3\end{bmatrix}\\ \tag{9} a\times b = \begin{bmatrix}a_2b_3-a_3b_2\\a_3b_1-a_1b_3\\a_1b_2-a_2b_1\end{bmatrix} \end{align}$$

위 식은 소행렬식과 여인수를 사용하여 계산할 수 있습니다.

numpy.cross() 함수를 사용하여 계산할 수 있습니다.

예)
  두 벡터 a, b의 외적을 계산합니다.

$$a=\begin{bmatrix} 2\\1\\-1\end{bmatrix} \quad b=\begin{bmatrix}-3\\4\\1 \end{bmatrix}$$
a=np.array([[2], [1],[-1]])
b=np.array([[-3],[4], [1]])
np.cross(a.T,b.T)
array([[ 5,  1, 11]])

위 결과 벡터는 그림 4에서 나타낸 것과 같이 벡터 a, b에 각각 수직입니다. 만약 두 벡터가 평행하다면 즉, 교차하는 지점이 없다면 두 벡터의 외적은 존재할 수 없습니다. 이 관계는 식 10으로 나타낼 수 있습니다.

$$\begin{equation}\tag{10} \parallel{a \times b}\parallel = \parallel{a}\parallel \parallel{b}\parallel \sin(\theta)\end{equation}$$

식 10에서 θ는 두 벡터 a, b의 사잇각이며 0 또는 180°일 경우 외적은 0이 됩니다.

θ = 0 or 180° → sin(θ) = 0, ‖a×b‖ = 0
그림 4. 두 벡터의 외적.

외적을 사용하여 좌표를 통과하는 방정식을 계산할 수 있습니다.

예)
 A(2,-2, 1), B(-1, 0, 3), C(5, -3, 4)의 세 좌표들을 포함하는 평면의 식은 계산해 봅니다.

$$A=\begin{bmatrix} 2\\-2\\1\end{bmatrix} \quad B=\begin{bmatrix}-1\\0\\3 \end{bmatrix} \quad C=\begin{bmatrix}5\\-3\\4 \end{bmatrix}$$

세 점을 포함하는 평면은 $\overrightarrow{AB}$와 $\overrightarrow{AC}$ 역시 포함합니다.

A=np.array([2,-2, 1])
B=np.array([-1,0,3])
C=np.array([5, -3, 4])
AB=B-A
AB
array([-3,  2,  2])
AC=C-A; AC
array([ 3, -1,  3])

위 두 벡터에 수직인 벡터는 외적으로 계산할 수 있습니다.

r=np.cross(AB,AC)
r
array([ 8, 15, -3])

r은 $\overrightarrow{AB}$와 $\overrightarrow{AC}$에 의해 이루어지는 평면과 수직입니다. 그러므로 그 평면의 임의점 (x, y, z)에 대한 다음 내적이 0이 됩니다.

x, y, z=sp.symbols('x y z')
X=sp.Matrix([x,y,z])
X
$\color{navy}{\left[\begin{matrix}x\\y\\z\end{matrix}\right]}$
AX=X-sp.Matrix(A)
AX
$\color{navy}{\left[\begin{matrix}x - 2\\y + 2\\z - 1\end{matrix}\right]}$
AX.T*sp.Matrix(r)
$\color{navy}{\left[\begin{matrix}8 x + 15 y - 3 z + 17\end{matrix}\right]}$

위 결과로부터 평면의 식은 8x + 15y - 3z + 17 = 0이 됩니다.

댓글

이 블로그의 인기 게시물

유사변환과 대각화

내용 유사변환 유사행렬의 특성 대각화(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의 그래프 종류

1. 산포도(scatter plot) plt.scatter(x, y) >>> import matplotlib.pyplot as plt >>> import numpy as np >>> data=np.random.rand(1024, 2) >>> data[:3, :] >>> plt.scatter(data[:,0], data[:,1]) >>> plt.show() 2. 막대그래프(bar chart) plt.bar(x, hight, width, align='center') 매개변수중 width에 인수를 전달하여 막대의 두께를 조절할 수 있다. 또한 align의 인수는 'center'와 'edge' 이다. 기본값은 'center'이다. 이 값은 x축의 레이블이 막대의 중간에 위치(center) 또는 왼쪽 가장자리에 위치(edge)시킨다. 코드에서 np.random.randint 는 특정한 범위내에서 지정한 갯수의 랜덤수를 생성 np.unique(배열, retrun_counts=False, axis=None) : 객체 내의 중복되지 않은 수들을 반환한다. return_counts=True이면 각 수에 대한 빈도수를 반환한다. axis를 통해 행(1), 열(0)을 선택한다. >>> x=np.random.randint(1, 6, size=100) >>> uni,count=np.unique(x, return_counts=True) >>> uni array([1, 2, 3, 4, 5]) >>> count array([25, 17, 23, 16, 19], dtype=int64) >>> plt.bar(uni, count) >>> plt.show() 위의 막대그래프의 막대의

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수