기본 콘텐츠로 건너뛰기

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

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은 열단위 즉, 행 방향으

벡터 공간(vector space)과 부분공간

내용

벡터공간

이 글은 선형시스템 또는 선형결합에 대한 지식이 필요합니다.

벡터들과 스칼라간의 연산에 의해 선형결합의 성립될 수 있으며 그 결과벡터는 연산에 사용된 벡터들이 존재하는 공간의 부분으로 존재합니다. 이렇게 벡터들이 존재하는 공간을 벡터 공간(Vector space)이라고 합니다.

선형결합에 의한 벡터 공간에서 벡터와 스칼라 간에 다음과 같은 다양한 연산 법칙이 성립됩니다.

벡터 공간에서의 연산 법칙
u, v ∈ Vector → u+v ∈ Vector
u, v가 모두 벡터이면 그들의 합은 벡터(u+v)
α ∈ scalar, u ∈ Vector → ;αu ∈ Vector
α가 스칼라(C)이고 u가 벡터라면 이 둘의 곱인 αu는 벡터
u + v = v + u
벡터들의 합은 교환법칙 성립
u + (v + w) = ( u + v) + w
벡터들의 합은 결합법칙 성립
모든 요소가 0인 0벡터(zero vector)가 존재
u가 벡터이고 -u 역시 벡터라면 u + (-u) = 0
α, β ∈ scalar, u ∈ Vector → α(βu) = (α β) u
스칼라 배수 법칙 성립
α ∈ scalar and u ∈ Vector → α(u + v) = α u + α v
스칼라와 벡터의 곱에서 분배법칙이 성립
α, β ∈ scalar u ∈ Vector → (α + β)u = α u + β u
두 개의 스칼라와 한 개의 벡터사이에 분배법칙이 성립
u ∈ V → 1·u = u

부분공간

일반적으로 벡터 공간 (Vector space)은 벡터들로 구성된 집합을 의미합니다. 위에서 소개한 벡터 공간에서 여러 연산들을 통해 새로운 벡터를 생성할 수 있습니다. 생성된 벡터들은 피연산 벡터들에 의해 형성되는 공간내에 존재합니다. 다시 말하면 결과벡터의 공간은 피연산 벡터들의 부분공간(subspace)이라고 합니다. 이 부분공간은 집합의 부분집합과 유사한 개념입니다.

예를 들어 벡터 공간에 V, W가 존재하며 W ⊆ V 즉, W가 V의 부분집합이라면 W는 V의 부분공간(subspace, H)이라고 합니다.

부분공간은 다음 3가지 특성을 가집니다.

부분공간의 특성
  • 모든 벡터 공간(V)내의 0벡터는 부분 공간(H)이 됩니다.
  • u, v ∈ H → u + v ∈ H
  • v ∈ H → cv ∈ H

u와 v는 벡터(Vector)이고 c는 스칼라(Scalar)를 나타냅니다.

그러므로 벡터들 간의 연산의 결과인 벡터사이에 선형결합이 성립되는 것입니다. 즉 선형결합이 성립하면 결과벡터는 피연산 벡터들의 부분공간이 됩니다.

실수 $\mathbb{R}^n$의 부분 공간은 다음 중 하나를 의미합니다.

  • 동차 선형 시스템의 모든 해(solution)집합
  • 특정한 벡터들의 모든 선형 결합의 집합
예를 들어 두 벡터 u, v가 식 1을 만족한다면, av + bu는 벡터 u와 v의 부분공간이 됩니다. $$u=\begin{bmatrix} 1\\ 1\\ 1\\ 0\end{bmatrix} \qquad v=\begin{bmatrix}3\\ -1\\ 0\\ 1 \end{bmatrix}$$ $$\begin{equation}\tag{1} \begin{matrix}u, v \in \mathbb{R} \rightarrow au + bv \subset \mathbb{R} \\ a, b: \text{scalar},\; u, v: \text{vector}\end{matrix} \end{equation}$$

예)
  다음 선형 결합의 성립 여부를 결정하여 봅니다.

$$\begin{matrix}x − 3y = 0\\x − y = 0\\x = 0\\ y = 0 \end{matrix} \rightarrow \begin{bmatrix}1 & -3\\1 & -1\\ 1 & 0\\ 0 & 1\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}=\begin{bmatrix}0\\0\\0\\0\end{bmatrix}$$
import numpy as np
import numpy.linalg as la
import sympy as sp
import matplotlib.pyplot as plt
A=np.array([[ 1, -3], [-1, 1], [ 1, 0], [0, 1]])
c=np.zeros([4,1])
au=np.hstack([A, c])
au
array([[ 1., -3.,  0.],
           [-1.,  1.,  0.],
           [ 1.,  0.,  0.],
           [ 0.,  1.,  0.]])
sp.Matrix(au).rref()[0]
$\color{navy}{\left[\begin{matrix}1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 0\\0 & 0 & 0\end{matrix}\right]}$

위 결과에서 자유 변수가 없으므로 자명한 해가 존재합니다. 즉, 벡터 u, v의 선형 결합이 성립합니다. 그러므로 그 선형 결합의 결과를 H라고 하면 H는 벡터 u, v가 존재하는 벡터 공간의 부분 공간이 되며 u, v는 H의 스판이 됩니다.

H = span{u, v}

위의 결과는 다음과 같이 정리할 수 있습니다.

v1, v2, …, vp ⊂ V(벡터공간)이면 그 벡터들에 의한 선형 결합의 결과 H는 벡터공간 V의 부분공간이 됩니다.

다음과 같이 span으로 나타낼 수 있습니다.

H = Span{v1, v2, …, vp}

예)
 다음 세 개의 벡터 v1, v2, v3가 모두 3차원 벡터 공간에 존재한다면 벡터 y 역시 동일한 벡터 공간의 부분공간이 되기 위한 h값을 결정해 봅니다.

$$v_1=\begin{bmatrix}1\\-2\\-2\end{bmatrix} \quad v_2= \begin{bmatrix}15\\-4\\-7\end{bmatrix} \quad v_3= \begin{bmatrix}-3\\1\\0\end{bmatrix} \quad y=\begin{bmatrix}-4\\3\\7\end{bmatrix}$$

벡터들 사이에 선형 결합이 성립하는지를 결정하는 것입니다. 그러나 벡터 y에 미지수 h가 포함되어 있습니다. 미지수가 포함된 연산은 sympy 라이브러리의 symbols()함수를 사용합니다. 이 함수는 기호를 연산할 수 있는 미지수로 변환하기 때문에 미지수를 포함하는 다양한 연산이 가능합니다.

v1=np.array([1,-2,-2]).reshape(-1,1)
v2=np.array([5,-4, -7]).reshape(-1,1)
v3=np.array([-3, 1, 0]).reshape(-1,1)
V=np.hstack([v1,v2,v3])
V
array([[ 1,  5, -3],
           [-2, -4,  1],
           [-2, -7,  0]])
h=sp.symbols("h")
y=sp.Matrix([[-4], [3], [h]])
y
$\color{navy}{\left[\begin{matrix}-4\\3\\h\end{matrix}\right]}$
au=sp.Matrix(V).row_join(y)
au
$\color{navy}{\left[\begin{matrix}1 & 5 & -3 & -4\\-2 & -4 & 1 & 3\\-2 & -7 & 0 & h\end{matrix}\right]}$
au.rref()[0]
$\color{navy}{\left[\begin{matrix}1 & 0 & 0 & \frac{h}{3} - \frac{5}{3}\\0 & 1 & 0 & \frac{10}{21} - \frac{5 h}{21}\\0 & 0 & 1 & \frac{11}{7} - \frac{2 h}{7}\end{matrix}\right]}$

위 결과에 의하면 자유 변수가 존재하지 않습니다. 즉, h 값에 관계없이 벡터들의 선형 관계는 성립합니다. 그러므로 벡터 v1, v2, v3 변형에 의해 y를 나타낼 수 있으므로 그 벡터들은 y의 span이 되며 세 벡터가 존재하는 3차원 벡터 공간의 부분 공간이 됩니다.

y = Span{v1, v2, v3}
v1, v2, v3 ⊂ $\mathbb{R}^3$ → y ∈ $\mathbb{R}^3$

예)
  H가 4차원의 좌표(a, b, c, d)에서 다음 식들을 만족하는 모든 벡터들의 집합이라고 한다면 H가 4차원의 부분 공간인지를 확인합니다.

$$\begin{aligned}&a - 2b + 5c - d& = 0\\ &-a - b + c& = 0\end{aligned}\quad \rightarrow \begin{bmatrix} 1 & -2 & 5& -1\\-1 & -1 & 1& 0\end{bmatrix} \begin{bmatrix} a\\b\\c\\d\end{bmatrix}=\begin{bmatrix} 0\\0\end{bmatrix}$$
A=np.array([[1,-2,5,-1],[-1, -1, 1, 0]])
c=np.zeros([2,1])
au=np.hstack([A, c])
au
array([[ 1., -2.,  5., -1.,  0.],
           [-1., -1.,  1.,  0.,  0.]])
sp.N(sp.Matrix(au).rref()[0], 3)
$\color{navy}{\left[\begin{matrix}1.0 & 0 & 1.0 & -0.333 & 0\\0 & 1.0 & -2.0 & 0.333 & 0\end{matrix}\right]}$

위 결과는 2개의 자유 변수가 존재합니다. 즉, 변수 a와 b는 c, d 값들에 의존하므로 자명하지 않은(non trivial) 해를 갖습니다. 즉, 이 결합은 선형 종속입니다. 결과적으로 위 동차 선형 결합은 성립하므로 표준 행렬에 의해 생성되는 벡터 [[a], [b], [c], [d]]는 4차원의 부분 공간이 됩니다.

부분공간의 차원

위 예의 결과는 4차원의 부분 공간이기는 하지만 그 부분공간의 차원이 4차원일까요? 만약에 위 선형 결합이 선형 독립이라면 부분공간 H 역시 4차원이 될 것입니다. 그 결과는 다음과 같이 정리할 수 있습니다.

$$\begin{bmatrix}a\\b\\c\\d \end{bmatrix}=\begin{bmatrix}-c+\frac{d}{3}\\2c-\frac{d}{3}\\c\\d\end{bmatrix}$$

H의 구성 부분인 a, b와 c, d는 상호 의존 관계가 됩니다. 즉, a, b에 대응하는 벡터로 c 또는 d와 선형 결합이 성립될 수 있습니다. 위 예의 표준 행렬 A의 각 벡터 A1, A2, A3, A4는 각각 변수 a, b, c, d에 대응합니다. 그러므로 다음의 선형 결합이 선형 독립인지를 확인해 봅니다.

$$\begin{aligned} aA_1 + bA_2 &= c\\ aA_1 + bA_2 &= d\end{aligned}$$
A1=np.array([1,-1]).reshape(-1,1)
A2=np.array([-2,-1]).reshape(-1,1)
A3=np.array([5,1]).reshape(-1,1)
A4=np.array([-1,0]).reshape(-1,1) 

위 코드의 결과 즉, 각 벡터는 다음과 같습니다.

$$A_1=\begin{bmatrix} 1\\-1\end{bmatrix} \quad \;A_2=\begin{bmatrix}1\\-1 \end{bmatrix} \quad A_3=\begin{bmatrix} 5\\1\end{bmatrix} \quad A_4=\begin{bmatrix} -1\\0\end{bmatrix} $$
# A1·a+A2·b= A3
A_123=sp.Matrix(np.hstack([A1,A2,A3])).rref()[0]
A_123
$\color{navy}{\left[\begin{matrix}1 & 0 & 1\\0 & 1 & -2\end{matrix}\right]}$
# A1·a+A2·b= A4 
A_124=sp.Matrix(np.hstack([A1,A2,A4])).rref()[0]
A_124
$\color{navy}{\left[\begin{matrix}1 & 0 & - \frac{1}{3}\\0 & 1 & \frac{1}{3}\end{matrix}\right]}$

위 결과에 의하면 두 선형 결합 모두 선형 독립입니다. 즉, 4개의 벡터 A1, A2, A3, A4 중에서 선형 독립인 벡터들을 나타내는 기저 벡터(basis vector)는 A1, A2이므로 이 예의 스판(Span)은 다음과 같이 나타낼 수 있습니다.

$$\begin{aligned} H &= \text{Span}\{A_1, A_2\}\\ &= \text{Span} \left\{\begin{bmatrix}1\\-1\end{bmatrix}, \quad \begin{bmatrix}-1\\-1\end{bmatrix}\right\}\end{aligned}$$
기저벡터(basis vector)

모든 선형 독립인 선형 결합을 표현할 수 있는 벡터들을 기저 벡터라고 하며 대상이 되는 모든 벡터들의 기약행사다리꼴 형태에서 피벗 열(pivot column)에 해당하는 벡터와 같습니다.

위의 A1·a+A2·b= A3을 그래프로 작성해 봅시다.

$$\begin{align}&a+b=5\\&-a-b=1\end{align}$$
a=np.linspace(-3, 3, 100)
b1=(a-5)/2 
b2=-a-1
plt.figure(dpi=100)
plt.plot(a, b1, label="a-2b=5")
plt.plot(a, b2, label="-a-b=1")
plt.scatter(1, -2, color="red", label="solution")
plt.legend(loc="best", prop={'weight':'bold'})
plt.xlabel("a", weight='bold')
plt.ylabel("b", weight='bold')
plt.grid(True)
plt.show()

위 그림에서 두 식의 해 (1, -2)는 두 직선에 의해 형성되는 공간에 포함됩니다. 그러므로 해(solution)는 두 직선들을 새로운 축으로 설정하여 나타낼 수 있습니다. 축의 갯수는 그 벡터의 차원이 됩니다.

그러므로 유일한 해는 기저벡터들의 결과이고 이는 결과에 대한 스판(Span)이므로 기저벡터들의 수, 즉 스판의 수가 그 부분공간(해)의 차원이 됩니다. 이 예의 경우 부분공간 H는 2차원이 됩니다.

부분공간의 차원
  • 피벗 열(pivot column)이 기저 벡터가 됩니다.
  • 스판(Span)은 기저 벡터로 구성되며 기저 벡터의 수가 부분 공간의 차원이 됩니다.

예)
 다음 벡터들에 의한 부분 벡터의 기저와 그 부분 공간의 차원을 계산합니다.

$$\begin{bmatrix}1\\-3\\2\\-4 \end{bmatrix} \quad \begin{bmatrix}-3\\9\\-6\\12 \end{bmatrix} \quad \begin{bmatrix}2\\-1\\4\\2 \end{bmatrix} \quad \begin{bmatrix}-4\\5\\-3\\7 \end{bmatrix}$$

위 각 벡터들의 결합에 의한 행렬 A는 다음과 같습니다. 그 행렬의 기약행사다리꼴의 피벗열이 기저가 되며 그 기저의 수가 부분행렬의 차원이 됩니다.

A=sp.Matrix([[1,-3, 2, -4],[-3, 9, -1, 5], [2, -6, 4, -3],[-4, 12, 2, 7]])
A
$\color{navy}{\left[\begin{matrix}1 & -3 & 2 & -4\\-3 & 9 & -1 & 5\\2 & -6 & 4 & -3\\-4 & 12 & 2 & 7\end{matrix}\right]}$
A_rref=A.rref()
A_rref[0]
$\color{navy}{\left[\begin{matrix}1 & -3 & 0 & 0\\0 & 0 & 1 & 0\\0 & 0 & 0 & 1\\0 & 0 & 0 & 0\end{matrix}\right]}$

결과에 의하면 0, 2, 4열이 피벗열이며 이 벡터들에 의해 생성되는 부분공간은 선형결합을 만족하는 것으로서 다음과 같이 나타낼 수 있습니다.

$$\begin{bmatrix}  1&  2 &-4 \\ -3& -1&  5 \\ 2 & 4 &-3 \\ -4 & 2 & 7 \end{bmatrix} \begin{bmatrix} x_1\\x_2\\x_3\end{bmatrix}= \begin{bmatrix}0\\0\\0 \end{bmatrix}$$

위 식들은 3개의 피벗열, 즉 3개의 기저벡터를 가집니다. 그러므로 부분공간의 차원은 3입니다.

댓글

이 블로그의 인기 게시물

유사변환과 대각화

내용 유사변환 유사행렬의 특성 대각화(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$$ 실수