Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Optimization
- bayesian inference
- Media Mix Modeling
- Marketing Mix Modeling
- 프로그래머를 위한 선형대수 #선형대수 #LU분해
- bayesian
- 프로그래머를 위한 선형대수 #선형대수 #행렬계산
- lightweightmmm
- 프로그래머를 위한 선형대수 #선형대수 #고유값 #고유벡터 #야코비 회전법 #QR법 #하우스홀더반사 #행렬회전
- mmm
- 프로그래머를 위한 선형대수 #선형대수 #고유분해 #고윳값 #고유벡터
- 프로그래머를 위한 선형대수 #선형대수 #고유값 #고유벡터 #고유분해
- 미적분 #접선의 방정식 #최적화 #뉴턴법 #뉴턴-랩슨법
- 미적분 #사인과 코사인의 도함수
- 미적분 #평균값 정리 #로피탈의 정리 #접선의 방정식
- 시계열분석 #Time-Series Analysis #이상탐지 #Anomaly Detection #Spectral Residual #CNN #SR-CNN
- 미적분
- 수리통계
Archives
- Today
- Total
문과생 네버랜드의 데이터 창고
3. 차원과 부분공간 본문
In [9]:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
from mpl_toolkits.mplot3d.art3d import Poly3DCollection
2. 차원과 공간¶
1) 열공간과 영공간¶
In [263]:
plt.figure(figsize = (20,5))
ax = plt.axes(projection="3d")
fig_1 = plt.subplot(1,3,1,projection="3d")
fig_2 = plt.subplot(1,3,2)
x = [0,1,1,0]
y = [0,0,1,1]
z = [0.4,0.4,0.4,0.4]
fig_1.add_collection3d(Poly3DCollection(verts))
fig_1.scatter3D(0.1,1,0.42,marker="o",c="r",label = "Vector X")
x = np.linspace(0,0,1000)
y = np.linspace(-1,1,1000)
#fig_2.plot(x,y)
fig_2.scatter(0,0,marker = "v", c = "r",label = "Vector 0")
fig_1.legend()
fig_2.legend()
plt.show()
- 파란색의 부분공간이 오른쪽의 벡터 [0,0,0]으로 변환된다.
- 즉, o = Ax에서 A에 의해서 변환되는 벡터X가 속하는 오른쪽의 부분공간(직사각형)이 몽땅 0벡터로 수렴하는 부분공간(직사각형)을 영공간이라고 칭한다.
(2) 열공간¶
In [274]:
plt.figure(figsize = (20,5))
ax = plt.axes(projection="3d")
fig_1 = plt.subplot(1,3,1,projection="3d")
fig_2 = plt.subplot(1,3,2)
x = [0,1,1,0]
y = [0,0,1,1]
z_1 = [0.4,0.4,0.4,0.4]
z_2 = [0.8,0.8,0.8,0.8]
verts_1 = [list(zip(x,y,z_1))]
verts_2 = [list(zip(x,y,z_2))]
fig_1.add_collection3d(Poly3DCollection(verts_1))
fig_1.add_collection3d(Poly3DCollection(verts_2))
fig_1.scatter3D(0.1,1,0.81,marker="o",c="r",zorder=2,label = "vector X")
x = np.linspace(0,0,1000)
y = np.linspace(-1,1,1000)
fig_2.plot(x,y)
fig_2.scatter(0,0,marker = "v", c = "r",label = "Vector 0")
fig_2.scatter(0,0.75,marker="^",c="y",label = "Vector X_trans")
fig_1.legend()
fig_2.legend()
plt.show()
- 이 때, 원점(빨간색 아랫삼각형)과 다른 벡터(노란색 윗삼각형)을 포함하는 왼쪽의 파란 실선을 열공간이라고 한다.
- 오른쪽의 영공간(정가운데 직사각형)과 왼쪽의 열공간(실선)의 차원은 서로 Trade-Off관계에 놓여 있으며,
- 왼쪽의 영공간과 오른쪽의 열공간의 차원을 더하면 원래 공간의 차원(2 + 1 = 3)차원이 된다.
2) 선형독립, 선형종속¶
(1) 선형독립과 선형종속¶
- Aa = y인 벡터a가 속하는 부분공간을 정의하자
- Ab = y인 벡터b가 속하는 부분공간도 정의하자.
- 이 때, Aa = Ab로 정의할 수 있다. 즉, 벡터a와 벡터b가 동일한 벡터 y로 변환된다.
In [205]:
plt.figure(figsize = (20,5))
ax = plt.axes(projection="3d")
fig_1 = plt.subplot(1,3,1,projection="3d")
fig_2 = plt.subplot(1,3,2,projection="3d")
fig_1.scatter3D(0.1,1,0.42,marker="o",c="r")
fig_1.scatter3D(0.2,1,0.6,marker="o",c="r")
fig_2.scatter3D(0,0,0,marker = "v", c = "b")
plt.show()
- 이 때, Aa = Ab로 정의할 수 있고, 좌변으로 이항하면 Aa - Ab = 0이다.
- Aa - Ab = A(a-b) = 0으로 정리할 수 있다.
- 만약 (a-b) = u가 영벡터라면,a와 b는 같은 벡터이며 단사 조건을 위반하지 않는다.(즉, 하나의 x가 하나의 y에만 대응한다)
- 즉 단사조건을 위반하지 않는 것이 전제조건일 때, (a-b) = u는 영벡터야만 한다.
- 만일 (a-b) /= 0인데 (a-b)A = 0이면, 이는 A의 열중 최소 하나는 다른 열들로 표현이 가능한 선형 종속상태에 놓여있음을 의미한다.
(2) 선형독립여부의 판단 : Rank 구하기¶
- 변환 후 공간에서 열공간이 이 공간의 전체 차원을 차지하고 있다면,(즉 변환후 공간의 차원 - 열공간의 차원 = 0)
- 또, 앞서 열공간과 영공간의 차원은 Trade off(영공간의 차원 + 열공간의 차원 = 변환전 공간의 차원)이라고 언급했으므로
- (1) 영공간의 차원이 0이고,
- (2) 열공간이 변환후 공간의 차원을 모두 포함하면서
- (3) 변환전 공간의 차원 = 변환후 공간의 차원 이라면
- 변환 과정에서 잃어버리는 정보의 손실은 전혀 발생하지 않는다.
In [254]:
plt.figure(figsize = (20,5))
ax = plt.axes(projection="3d")
fig_1 = plt.subplot(1,3,1,projection="3d")
fig_2 = plt.subplot(1,3,2,projection="3d")
x = [0,1,1,0]
y = [0,0,1,1]
z_1 = [0.4,0.4,0.4,0.4]
verts_1 = [list(zip(x,y,z_1))]
fig_1.add_collection3d(Poly3DCollection(verts_1))
x_2 = [1,0,1,1]
y_2 = [0,0,0,1]
z_2 = [0.8,0.8,0,0]
verts_2 = [list(zip(x_2,y_2,z_2))]
fig_2.add_collection3d(Poly3DCollection(verts_2))
plt.show()
- 기본적으로, 행연산을 실시 전 열공간의 Rank와 행연산 실시 후 열공간의 Rank는 동일하다.
- 이를 이용하여, 행연산을 실시한 후의 열공간의 차원을 파악하여 독립여부를 파악한다.
In [295]:
A = np.matrix([[3,15,-27,-24],[1,7,5,4],[-2,-11,7,18]])
In [296]:
#Phase 1 : 1행에 (1/3)을 곱한다.
A_1 = A[0] * (1/3)
A_2 = A[1]
A_3 = A[2]
A = np.vstack([A_1,A_2,A_3])
print(A)
[[ 1. 5. -9. -8.]
[ 1. 7. 5. 4.]
[ -2. -11. 7. 18.]]
In [297]:
#Phase 2 : 2행에 1행을 더한다.
A_1 = A[0]
A_2 = A[1] + A[0]*(-1)
A_3 = A[2]
A = np.vstack([A_1,A_2,A_3])
print(A)
[[ 1. 5. -9. -8.]
[ 0. 2. 14. 12.]
[ -2. -11. 7. 18.]]
In [298]:
#Phase 3 : 3행에 1행을 더한다.
A_1 = A[0]
A_2 = A[1]
A_3 = A[2] + 2 * A[0]
A = np.vstack([A_1,A_2,A_3])
print(A)
[[ 1. 5. -9. -8.]
[ 0. 2. 14. 12.]
[ 0. -1. -11. 2.]]
In [299]:
# Phase 4 : 1열을 -5배하여 2열에 더해준다.
A_1 = A.T[0]
A_2 = A.T[1] + (-5) * A_1
A_3 = A.T[2]
A_4 = A.T[3]
A = np.vstack([A_1,A_2,A_3,A_4]).T
print(A)
[[ 1. 0. -9. -8.]
[ 0. 2. 14. 12.]
[ 0. -1. -11. 2.]]
In [300]:
# Phase 5 : 1열을 9배하여 3열에 더해준다.
A_1 = A.T[0]
A_2 = A.T[1]
A_3 = A.T[2] + 9 * A_1
A_4 = A.T[3]
A = np.vstack([A_1,A_2,A_3,A_4]).T
print(A)
[[ 1. 0. 0. -8.]
[ 0. 2. 14. 12.]
[ 0. -1. -11. 2.]]
In [301]:
# Phase 6 : 1열을 8배하여 4열에 더해준다.
A_1 = A.T[0]
A_2 = A.T[1]
A_3 = A.T[2]
A_4 = A.T[3] + 8 * A_1
A = np.vstack([A_1,A_2,A_3,A_4]).T
print(A)
[[ 1. 0. 0. 0.]
[ 0. 2. 14. 12.]
[ 0. -1. -11. 2.]]
In [302]:
# phase 7 : 2행에 (1/2)를 곱해준다.
A_1 = A[0]
A_2 = A[1] * (1/2)
A_3 = A[2]
A = np.vstack([A_1,A_2,A_3])
print(A)
[[ 1. 0. 0. 0.]
[ 0. 1. 7. 6.]
[ 0. -1. -11. 2.]]
In [303]:
# phase 8 : 2행을 3행에 더해준다.
A_1 = A[0]
A_2 = A[1]
A_3 = A[2] + A[1]
A = np.vstack([A_1,A_2,A_3])
print(A)
[[ 1. 0. 0. 0.]
[ 0. 1. 7. 6.]
[ 0. 0. -4. 8.]]
In [304]:
# phase 9 : 2열을 -7배 하여 3열에 더해준다.
A_1 = A.T[0]
A_2 = A.T[1]
A_3 = A.T[2] + (-7)*A_2
A_4 = A.T[3]
A = np.vstack([A_1,A_2,A_3,A_4]).T
print(A)
[[ 1. 0. 0. 0.]
[ 0. 1. 0. 6.]
[ 0. 0. -4. 8.]]
In [305]:
# phase 10 : 2열을 -6배 하여 4열에 더해준다.
A_1 = A.T[0]
A_2 = A.T[1]
A_3 = A.T[2]
A_4 = A.T[3] + (-6)*A_2
A = np.vstack([A_1,A_2,A_3,A_4]).T
print(A)
[[ 1. 0. 0. 0.]
[ 0. 1. 0. 0.]
[ 0. 0. -4. 8.]]
In [306]:
# phase 11 : 3열에 (-1/4)를 곱해준다.
A_1 = A.T[0]
A_2 = A.T[1]
A_3 = A.T[2] * (-1/4)
A_4 = A.T[3]
A = np.vstack([A_1,A_2,A_3,A_4]).T
print(A)
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 8.]]
In [307]:
# phase 11 : 3열을 -8배하여 4열에 더해준다.
A_1 = A.T[0]
A_2 = A.T[1]
A_3 = A.T[2]
A_4 = A.T[3] - 8 * A_3
A = np.vstack([A_1,A_2,A_3,A_4]).T
print(A)
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]]
계산 결과, Rank는 3으로 나타난다. Full-rank는 아니므로 역행렬은 존재하지 않는다.¶
'선형대수' 카테고리의 다른 글
6. 고유공간과 고유분해 (0) | 2023.05.03 |
---|---|
5. LU 분해 (0) | 2023.05.03 |
4. 행렬의 연산 (0) | 2023.05.03 |
2. 역행렬과 행렬식 (0) | 2023.05.03 |
1. 벡터와 행렬 (0) | 2023.05.03 |