기본 콘텐츠로 건너뛰기

[data analysis] 특징(변수) 선택

이차형태(Quadratic forms)

행렬에서 각 값을 제곱하는 형태는 전치행렬과의 행렬곱으로 이루어집니다.
$X^TX$
위 식으로 부터의 값들의 합과 일반적인 형태는 공학, 통계학, 경제학, 미분기하학등에서 많이 사용되는 것으로 이차 형태(Quadratic forms)라고 합니다.
$R^n$차원에서 이차형태는 함수 Q로 정의되며 벡터 x에 대해 다음과 같이 표현됩니다.
$Q(x)=x^TAx$
A : 이차형태의 행렬로서 $n \times n $차원의 대칭행렬
가장 간단한 이차형태는 $Q(x)=x^TIx=||x||^2$입니다.

>>> import numpy as np
>>> import numpy.linalg as LA
>>> import pandas as pd
>>> from sympy import *
>>> np.set_printoptions(precision=4, suppress=True)
1. 벡터 x의 Q(x)?
$x=\left[\begin{array}{r}x_1 \\x_2 \end{array}\right]$
>>>x1, x2=symbols("x1, x2")
>>> x=Matrix(2,1, [x1, x2]); x
Matrix([
[x1],
[x2]])
1)
>>> A=Matrix([[4,0],[0, 3]]); A
Matrix([
[4, 0],
[0, 3]])
>>> QA=x.T*A*x; QA
Matrix([[4*x1**2 + 3*x2**2]])
2)
>>> B=Matrix([[3,-2],[-2,7]]); B
Matrix([
[ 3, -2],
[-2,  7]])
>>> QB=x.T*B*x; QB
Matrix([[x1*(3*x1 - 2*x2) + x2*(-2*x1 + 7*x2)]])
>>> expand(QB)
Matrix([[3*x1**2 - 4*x1*x2 + 7*x2**2]])
위 결과로 부터 대칭행렬의 대각 원소들은 이차항의 계수이며 대각외 부분의 원소들의 합은 1차항의 계수가 됩니다. 이차식에서 1차항을 cross-product(교차곱)으로 생성되는 교차항이라고 합니다.

2. $Q(x)=5x_1^2+3x_2^2+2x_3^3-x_1x_2+8x_2x_3$의 이차행태?
대각원소: 5, 3, 2
대각외 원소: $-1 \rightarrow (\frac{-1}{2}, \frac{-1}{2}), \quad 8 \rightarrow (4,4)$
>>> x1, x2, x3=symbols("x1, x2, x3")
>>> x=Matrix(3,1, [x1, x2, x3]); x
Matrix([
[x1],
[x2],
[x3]])
>>> A=diag(5,3,2)
>>> A[0,1]=A[1,0]=-1/2
>>> A[0,2]=A[2,0]=0
>>> A[1,2]=A[2,1]=4
>>> A
Matrix([
[   5, -0.5, 0],
[-0.5,    3, 4],
[   0,    4, 2]])
$Q(x)=x^TAX\\=\left[\begin{array}{rrr}x_1&x_2&x_3\end{array}\right]\left[\begin{array}{rrr}5&-0.5&0\\-0.5&3&4\\0&4&2\end{array}\right]\left[\begin{array}{r}x_1\\x_2\\x_3\end{array}\right]$

3. $Q(x)=x_1^2-8x_1x_2-5x_2^2$의 이차형태? 다음 x 값들을 계산?
$x=\left[\begin{array}{r}-3\\1\end{array}\right], \; x=\left[\begin{array}{r}2\\-2\end{array}\right], \; x=\left[\begin{array}{r}1\\3\end{array}\right]$
>>> x1, x2=symbols("x1, x2")
>>> x=Matrix(2,1, [x1, x2]); x
Matrix([
[x1],
[x2]])
>>> A=diag(1,-5)
>>> A[0,1]=A[1,0]=-4
>>> A
Matrix([
[ 1, -4],
[-4, -5]])
1)$x(xx1)=\left[\begin{array}{r}-3\\1\end{array}\right]$
>>> xx1=x.subs([(x1, -3),(x2,1)]);xx1
Matrix([
[-3],
[ 1]])
>>> Qxx1=xx1.T*A*xx1; Qxx1
Matrix([[28]])
2) $x(xx2)=\left[\begin{array}{r}2\\-2\end{array}\right]$
>>> xx2=x.subs([(x1,2),(x2,-2)]);xx2
Matrix([
[ 2],
[-2]])
>>> Qxx2=xx2.T*A*xx2; Qxx2
Matrix([[16]])
3)$x(xx3)=\left[\begin{array}{r}1\\3\end{array}\right]$
>>> xx3=x.subs([(x1,1),(x2,-3)]);xx3
Matrix([
[ 1],
[-3]])
>>> Qxx3=xx3.T*A*xx3; Qxx3
Matrix([[-20]])

이차형태에서 교차항을 제거하는 경우 계산등에서 보다 편리하게 적용가능합니다. 만약 변수를 변화시킨다면 식의 변환이 가능할 것입니다. 이를 위해서 이차형태 행렬의 유사변환을 적용할 수 있으므로 행렬 A의 고유값과 고유벡터로 달성할 수 있습니다. D는 고유값을 대각 원소로 하는 대각행렬이고 P는 각 고유값에 대응하는 고유벡터들로 구성된 가역행렬입니다. A가 대칭행렬이므로 위의 변환은 항상 성립하며 P는 직교기저행렬이 됩니다.
$A=PDP^{-1}=PDP^{T}$
한 식의 변수벡터를 x라하고 이를 변환한 후의 변수벡터를 y라 하면 다음이 성립합니다.
x=My=Py
즉, x는 M의 열 벡터들에 의해 결정되는 기저에 대응하는 좌표벡터(좌표시스템 참조)가 됩니다. (행렬 M은 기저 행렬로 식에 관련된 A 행렬의 직교 기저행렬인 P와 같습니다.)
$x^TAx=(Py)^TA(Py)=y^TP^TAPy=y^T(P^TAP)y$
위 식으로 부터 새로운 형태의 이차형태 행렬은 $P^TAP$가 됩니다.
위 행렬은 A의 고유값을 대각 원소로 하는 대각행렬 D와 같습니다. 그러므로 다음이 성립합니다.
$x^TAx=y^TDy$

4. 위 예제 3에서의 이차행렬을 사용하여 cross-product를 제거하는 변수 변환에 의한 새로운 변수?
>>> A=np.diag([1,-5])
>>> A[0,1]=A[1,0]=-4
>>> A
array([[ 1, -4],
       [-4, -5]])
>>> d1, p=LA.eig(np.array(A))
>>> d1
array([ 3., -7.])
>>> p
array([[ 0.8944,  0.4472],
       [-0.4472,  0.8944]])
>>> D=np.diag(d1);D
array([[ 3.,  0.],
       [ 0., -7.]])
>>> y1, y2 =symbols("y1, y2")
$x=Py \rightarrow P^{-1}x=y \leftrightarrow P^Tx=y$
>>> y=Matrix(np.around(p.T, 3))*x;y
Matrix([
[0.894*x1 - 0.447*x2],
[0.447*x1 + 0.894*x2]])
위 결과를 정리하면 새로운 변수 $y_1, y_2$는 다음과 같습니다.
$y_1 = 0.894 \times x_1 + 0.447 \times x_2, \; y_2=0.447 \times x_1 + 0.894 \times x_2$
x=<2,-2>인 경우를 확인하여 봅니다.
$x^TAx$
>>> xx1=x.subs([(x1,2), (x2,-2)]);xx1
Matrix([
[ 2],
[-2]])
>>> xx1.T*Matrix(A)*xx1
Matrix([[16]])
새로운 변수를 적용하여 계산 역시 동일합니다.
$y^TDy$
>>> yy1=y.subs([(x1,2), (x2,-2)]); yy1
Matrix([
[  2.68328157299975],
[-0.894427190999916]])
>>> yy1.T*Matrix(D)*yy1
Matrix([[16.0]])

위 서술을 정리하면 다음과 같습니다.
$n \times n$의 대칭행렬 A를 이차형태 행렬이라고 하면 다음과 같이 변수벡터 x와의 곱으로 이차형태를 나타낼 수 있습니다.
$x^TAx$
이 변수벡터는 직교기저 행렬 P를 사용하여 $x=Py$를 사용하여 새로운 변수벡터 y로 변환할 수 있으며 A의 대각행렬 D(A의 고유값을 대각원소로 하는 대각행렬)를 사용하여 다음과 같은 계산으로 교차항을 제거한 이차형태를 나타낼 수 있습니다.
$y^TDy$
위에서 사용된 P의 각 열벡터들은 이차형태의 principal axes라고 하며 y는 이 principal axes에 의한 정규직교에 대한 x의 좌표벡터가 됩니다.
즉, y의 좌표는 P의 각 열벡터의 방향을 주축으로 할 때의 값과 같게 됩니다.
아래 그림에서 좌표 x=(2, -2)는 P의 각 열 벡터를 주축으로 할 경우의 좌표 y=(2.68328157299975, -0.894427190999916)와 동일합니다.
$x=y_1 \times P_1 + y_2 \times P_2$



5. $5x_1^2-4x_1x_2+5x_2^2=48$에서 교차항을 제거한 식으로 변환?
위 식에서의 A는 다음과 같습니다.
>>> x1, x2=symbols("x1, x2")
>>> A=np.array([[5, -2],[-2, 5]]);A
array([[ 5, -2],
       [-2,  5]])
>>> x=Matrix(2,1,[x1, x2])
>>> eq=factor(x.T*Matrix(A)*x);eq
Matrix([[5*x1**2 - 4*x1*x2 + 5*x2**2]])
A의 고유값과 고유행렬로 부터의 대각행렬과 표준행렬(P)를 생성합니다.
>>> d=np.diag(d1);d
array([[ 7.,  0.],
       [ 0.,  3.]])
>>> d1, p = LA.eig(A)
>>> d=np.diag(d1);d
array([[ 7.,  0.],
       [ 0.,  3.]])
>>> p
array([[ 0.7071,  0.7071],
       [-0.7071,  0.7071]])
$x=Py \rightarrow P^Tx=y$
>>> y=Matrix(p.T)*x; y
Matrix([
[0.707106781186547*x1 - 0.707106781186547*x2],
[0.707106781186547*x1 + 0.707106781186547*x2]])
$y^TDy$
>>> eq2=factor(y.T*d*y); eq2
Matrix([[1.0*(5.0*x1**2 - 4.0*x1*x2 + 5.0*x2**2)]])
위 식은 eq와 동일합니다. 새로운 변수 벡터 $y=<y_1, y_2>$로 나타내면 교차항이 제거된 형태가 됩니다.
>>> y1, y2=symbols("y1, y2")
>>> y=Matrix(2,1,[y1, y2]);y
Matrix([
[y1],
[y2]])
>>> eq2=y.T*d*y; eq2
Matrix([[7.0*y1**2 + 3.0*y2**2]])

이차형태는 이차 방정식을 의미합니다. 이러한 식은 다음 그림과 같이 결과가 존재하는 영역에 따라 구분할 수 있습니다.
위 그림은 모두 이차형태($x^TAX$) Q를 나타내는 것으로서 5종류로 구분할 수 있습니다.
1) $x \neq 0, Q(x) >0 \rightarrow \text{positive definite}$
2) $Q(x) \geq 0 \rightarrow \text{positive semidefinite}$  위그림의 a) & b)
3) $x \neq 0, Q(x) < 0 \rightarrow \text{negative definite}$
4) $Q(x) \leq 0 \rightarrow \text{negative semidefinite}$ 위 그림의 c)
5) $Q(x) >0 or Q(x) < 0 \rightarrow \text{indefinite}$

이차형태는 다음과 같이 나타낼 수 있습니다. (대칭행렬이 대각화와 스펙트럴 분해 참조)
$Q(x) =x^TAX=y^TDy\\=\lambda_1 y_1^Ty_1+\lambda_2 y_2^Ty_2+\cdots +\lambda_n y_n^Ty_n\\=\lambda_1 y_1^2+\lambda_2 y_2^2+\cdots +\lambda_n y_n^2$
$\lambda$:행렬 A의 고유값입니다.
그러므로 이차형태의 부호는 고유값에 의존합니다.

6. $Q(x)=3x_1^2+2x_2^2+x_3^2+4x_1x_2+4x_2x_3$, positive definite?
>>> A=np.diag([3,2,1]);A
array([[3, 0, 0],
       [0, 2, 0],
       [0, 0, 1]])
>>> A=np.diag([3,2,1])
>>> A[0,1]=A[1,0]=2
>>> A[1,2]=A[2,1]=2
>>> A
array([[3, 2, 0],
       [2, 2, 2],
       [0, 2, 1]])
>>> d, p=LA.eig(A)
>>> d
array([ 5.,  2., -1.])
>>> p
array([[-0.6667,  0.6667,  0.3333],
       [-0.6667, -0.3333, -0.6667],
       [-0.3333, -0.6667,  0.6667]])
이차형태 행렬 A 의 고유값 중에 음수가 포함되어 있습니다. 그러므로 위 식은 indefinite입니다.

이 블로그의 인기 게시물

유사변환과 대각화

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