코딩 더 매트릭스 - 4장 벡터공간 (1)

선형결합, Span, 벡터공간

2018년 11월 25일

필립 클라인의 저서 코딩 더 매트릭스 4장 벡터공간.


  1. 선형결합과 Span을 알아봅니다.
  2. 기하 객체 flat을 알아 보고 flat을 표현하는 두 가지 방법을 알아봅니다.
  3. 벡터공간의 성질을 알아보고 벡터들의 생성으로서, 해집합으로서 이 성질들을 만족하는지 알아봅니다.





선형결합

벡터 v1,v2,...,vnv_1, v_2, ..., v_n이 있을때 이들의 선형결합은 다음과 같이 표현됩니다.

α1v1+α2v2+...+αnvn\alpha_1 v_1 + \alpha_2 v_2 + ... + \alpha_n v_n

αi\alpha_i는 스칼라이고 선형결합에서 이들을 계수라고 합니다. 만약 선형결합에서 모든 계수가 0이면 자명한(trivial) 선형결합이라고 합니다.

다음은 선형결합을 이용해 문제를 해결하는 예시입니다. 한 과자 공장에서 다음과 같은 제품과 원료 표를 가지고 있습니다. (수치는 퍼센트가 아닙니다.)

소금 밀가루 식용유 설탕
새우깽 0 1.3 0.2 0.8 0.4
바나나슛 0 0 1.5 0.4 0.3
홈런밥 0.25 0 0 0.2 0.7
멋동산 0 0 0.3 0.7 0.5
포커칩 0.15 0 0.5 0.4 0.8

과자 공장에서 10개의 새우깽을 생산한다면 새우깽 하나를 생산하는데 필요한 원료량은 벡터 v새우깽v_{새우깽}을 스칼라곱한 10v새우깽10 v_{새우깽}입니다. 선형결합을 이용해 과자 하나를 생산하는데 필요한 원료량 v과자v_{과자}와 생산량 스칼라 α과자\alpha_{과자}를 곱해 더하면 각각의 원료의 필요한 전체 양을 구할 수 있습니다. α새우깽v새우깽+α바나나슛v바나나슛+α홈런밥v홈런밥+α멋동산v멋동산+α포커칩v포커칩\alpha_{새우깽} v_{새우깽} + \alpha_{바나나슛} v_{바나나슛} + \alpha_{홈런밥} v_{홈런밥} + \alpha_{멋동산} v_{멋동산} + \alpha_{포커칩} v_{포커칩} 위의 프로세스를 코드로 작성해 보겠습니다.

from vecutil import Vec

# 정의역 필요한 원료 집합
D = { '소금', '밀가루', '물', '식용유', '설탕' }
# 새우깽 생산 하나 당 필요 원료
v_s = Vec(D, {'밀가루': 1.3, '물': .2, '식용유': .8, '설탕': .4 })
# 바나나슛 생산 하나 당 필요 원료
v_b = Vec(D, {'물': 1.5, '식용유': .4, '설탕': .3 })
# 홈런밥 생산 하나 당 필요 원료
v_h = Vec(D, { '소금': .25, '식용유': .2, '설탕': .7 })
# 멋동산 생산 하나 당 필요 원료
v_m = Vec(D, {'물': .3, '식용유': .7, '설탕': .5 })
# 포커칩 생산 하나 당 필요 원료
v_p = Vec(D, { '소금': .15, '물': .5, '식용유': .4, '설탕': .8 })

print(240 * v_s + 55 * v_b + 150 * v_h + 133 * v_m + 90 * v_p)
>>>
물    밀가루     설탕     소금    식용유
----------------------------------
215.4  312.0  356.0   51.0  373.1





생성(Span)과 생성자(generator)

벡터들 {v1,v2,...,vn}\{v_1, v_2, ..., v_n\}의 모든 선형결합으로 이루어진 집합을 이 벡터들의 생성이라 하고 Span{v1,v2,...,vn}Span\{v_1, v_2, ..., v_n\}라고 씁니다. 각각의 viv_i는 생성자라 합니다. Span을 이해하는 가장 좋은 방법은 직접 생성자들과 그들로 이루어지는 Span을 그려보는 것입니다. 두 3-벡터 [1,0,1.65],[0,1,1]][1, 0 ,1.65], [0, 1 ,1]]의 Span은 Span{[1,0,1.65],[0,1,1]}Span\{[1, 0 ,1.65], [0, 1 ,1]\}라고 쓰고 이것은 3차원 공간에서 평면을 그려냅니다. 이 평면이 원점을 지날 때 평면의 방정식을 구해보겠습니다. 두 벡터 생성자의 법선벡터를 구할 수 있다면 법선벡터와 평면 위의 한 점을 알게되므로 평면의 방정식을 쓸 수 있습니다. 법선벡터는 두 벡터의 외적으로 구합니다.

ijk101.65011=1.65i1j+1k\begin{vmatrix} i & j & k \\ 1 & 0 & 1.65 \\ 0 & 1 & 1 \end{vmatrix} = -1.65i - 1j + 1k

평면의 방정식에 이를 적용하면 1.65xy+z=0-1.65x -y + z = 0를 구할 수 있습니다. matplotlib를 이용해 생성자 벡터와 평면을 그려보겠습니다.

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

# 생성자
origin = [0,0,0]
X, Y, Z = zip(origin, origin)
V = np.array([
    [1, 0 ,1.65],
    [0, 1 ,1],
])

# 평면
x, y = np.meshgrid(range(5), range(5))
z = 1.65*x + 1.0*y

ax = plt.subplot(111, projection='3d')
ax.plot_surface(x, y, z)
ax.quiver(X, Y, Z, V[:, 0], V[:, 1], V[:, 2], color='r', linewidths=5)
plt.show()

생성자 중에 다음과 같은 경우를 표준 생정자 (Standard generator)라고 합니다.

[x,y,z]=[1,0,0]x+[0,1,0]y+[0,0,1]z[x, y, z] = [1, 0, 0]x + [0, 1, 0]y + [0, 0, 1]z





GF(2) 상의 벡터들의 생성

GF(2) 상의 벡터들의 선형결합을 만들어내는 프로시저 GF2_span을 작성해 보겠습니다. GF2_span은 벡터들의 리스트 L을 인수로 받아 L내 벡터들의 모든 선형결합을 만들어 냅니다.

from GF2 import one
from vecutil import zero_vec, Vec, list2vec

def GF2_span(L, D):
    i = 0
    result = []
    init = zero_vec(D)
    while i < len(D) + 1:
        recursion(L, 0, init, i, result)
        i += 1
    return result

def recursion(arr, index, s, sum_count, result):
    if sum_count == 0:
        result.append(s)
        return
    i = 0
    while i < len(arr[index:]):
        recursion(arr, index + i + 1, s + arr[index + i], sum_count - 1, result)
        i += 1

# e.g.
D = {0,1,2,3,4}
L = [
    list2vec([one,0,0,0,0]),
    list2vec([0,one,0,0,0]),
    list2vec([0,0,one,0,0]),
    list2vec([0,0,0,one,0]),
    list2vec([0,0,0,0,one]),
]
l = GF2_span(L, D)

재귀함수 recursion은 주어진 벡터의 집합 arr을 인수로 받아 sum_count개수만큼 선형결합해 리스트의 리스트인 result에 넣습니다. 예를 들어 arr이 아래 GF(2) 상의 벡터들을 포함하고

u1=[1,0,0,0,0]u2=[0,1,0,0,0]u3=[0,0,1,0,0]u4=[0,0,0,1,0]u5=[0,0,0,0,1]\begin{aligned} \\ u_1 = [1,0,0,0,0] \\ u_2 = [0,1,0,0,0] \\ u_3 = [0,0,1,0,0] \\ u_4 = [0,0,0,1,0] \\ u_5 = [0,0,0,0,1] \end{aligned}

sum_count가 3이라면 아래와 같은 선형결합들을 만들어냅니다.

u1+u2+u3u1+u2+u4u1+u2+u5u1+u3+u4u1+u3+u5u1+u4+u5u2+u3+u4...u3+u4+u5\begin{aligned} u_1 + u_2 + u_3 \\ u_1 + u_2 + u_4 \\ u_1 + u_2 + u_5 \\ u_1 + u_3 + u_4 \\ u_1 + u_3 + u_5 \\ u_1 + u_4 + u_5 \\ u_2 + u_3 + u_4 \\ ... \\ u_3 + u_4 + u_5 \end{aligned}





벡터들의 집합에 대한 기하적 구조

R\Bbb{R}상의 두 벡터의 생성은 평면 또는 평면보다 차원이 낮은 객체 (직선 또는 점)입니다. 임의의 벡터들의 집합에 대한 생성은 원점을 포함해야 합니다. 모든 계수가 00인 자명한 선형결합이 포함되기 때문입니다.

  • 영벡터들의 생성은 점(영차원 객체)을 형성합니다. 이것은 원점입니다.
  • 하나의 벡터의 생성은 원점을 지나는 직선(1차원 객체) 또는 어떤 점, 즉 원점을 형성합니다.
  • 두 벡터의 생성은 원점을 지나는 평면(2차원 객체), 또는 원점을 지나는 직선, 또는 점, 즉 원점을 형성합니다.

점, 직선, 평면과 같은 기하적 객체를 flat이라 부릅니다. 물론 4차원 공간 R4\Bbb{R}^4에서 3차원 flat을 정의할 수 있습니다.
앞에서 예시로 그렸던 평면은 두 벡터의 생성으로서 Span{[1,0,1.65],[0,1,1]}Span\{[1, 0, 1.65], [0, 1, 1]\}로 표현했었습니다. 이 표현은 다음과 같이 집합으로 표현할 수도 있습니다. {(x,y,z)R3:[1.65,1,1][x,y,z]=0}\{ (x, y, z) \in \Bbb{R}^3 : [1.65, 1, -1] \cdot [x, y, z] = 0 \} 따라서 평면은 우변이 00인 선형방정식의 해집합입니다. 여기서 우변이 00인 선형방정식을 동차 선형방정식이라 하고 동차 선형방정식의 컬렉션을 동차 선형시스템이라 합니다. 앞으로 flat을 나타낼 때

  1. 어떤 벡터들의 생성으로서 e.g.Span{u,v}e.g. Span\{u, v\}
  2. 동차 선형시스템의 해집합으로서 e.g.{x:a1x=0,a2x=0,...,anx=0}e.g. \{x : a_1 \cdot x = 0, a_2 \cdot x = 0, ..., a_n \cdot x = 0\}

표현함으로서 필요에 따라 유용하게 사용할 수 있습니다.





벡터공간

정의역 DD와 공역 FF에 대해 FDF^D의 부분집합 VVVVFF상의 어떤 D-벡터들의 생성이든지 혹은 선형시스템의 해가 되든지 상관없이 다음 3가지 성질들을 가지고 있습니다.

  • VV는 영벡터를 포함합니다.
  • 모든 벡터 vv에 대해 VVvv를 포함하면 모든 스칼라 α\alpha에 대해 VVαv\alpha v를 포함합니다.
  • 모든 벡터들의 쌍 u,vu, v에 대해 만약 VVu,vu, v를 포함하면 VVu+vu + v를 포함합니다.

첫번째 벡터들의 생성 경우부터 증명해 보겠습니다. 먼저 VVSpan{v1,v2,...,vn}Span\{v_1, v_2, ..., v_n\}일때

  • 생성자들 각각에 스칼라 00을 곱하고 선형결합하면 0v1+0v2+...+0vn0v_1 + 0v_2 + ... + 0v_n이고 이것은 영벡터입니다.
  • 임의의 생성자 viv_i에 임의의 스칼라 α\alpha를 곱하고 나머지 생성자에 00을 곱해 선형결합하면 αvi+...+0vn\alpha v_i + ... + 0v_n이고 이는 VV에 포함됩니다.
  • Span{v1,v2,...,vn}Span\{v_1, v_2, ..., v_n\}은 생성자들의 모든 선형결합으로 이루어지므로 집합 {v1,v2,...,vn}\{v_1, v_2, ..., v_n\}중 임의의 벡터 uuvv의 선형결합 u+vu + vVV에 포함됩니다.

위의 증명들은 모두 VV어떤 D-벡터들의 생성이기 때문에 가능합니다.

두번째 선형시스템의 해집합인 경우도 증명해 보겠습니다. VV{x:a1x=0,a2x=0,...,anx=0}\{x : a_1 \cdot x = 0, a_2 \cdot x = 0, ..., a_n \cdot x = 0\}일때

  • a10=0,a20=0,...,an0=0a_1 \cdot 0 = 0, a_2 \cdot 0 = 0, ..., a_n \cdot 0 = 0 이므로 영벡터는 해집합의 원소입니다.
  • 임의의 스칼라 α\alpha에 대해 a1αx=0,a2αx=0,...,anαx=0a_1 \cdot \alpha x = 0, a_2 \cdot \alpha x = 0, ..., a_n \cdot \alpha x = 0이므로 αx\alpha x는 해집합의 원소입니다.
  • {x:a1x=0,a2x=0,...,anx=0}\{x : a_1 \cdot x = 0, a_2 \cdot x = 0, ..., a_n \cdot x = 0\} 를 만족하는 해 uu, vv에 대해
a1u+a2u+...+anu=0a1v+a2v+...+anv=0a1(u+v)+a2(u+v)+...+an(u+v)=0\begin{aligned} a_1 \cdot u + a_2 \cdot u + ... + a_n \cdot u = 0 \\ a_1 \cdot v + a_2 \cdot v + ... + a_n \cdot v = 0 \\ \therefore a_1 \cdot (u + v) + a_2 \cdot (u + v) + ... + a_n \cdot (u + v) = 0 \end{aligned}

벡터들의 집합 VV가 위의 세가지 성질을 만족하면 벡터공간이라고 합니다. 특히 영벡터만으로 구성된 벡터공간은 자명한 벡터공간이라고 합니다.





부분공간

VVWW가 벡터공간이고 VVWW의 부분집합이면 VVWW의 부분공간이라고 합니다. 예를 들어 {[0,0]}\{[0, 0]\}의 유일한 부분공간은 그 자신입니다. 집합 {[0,0]}\{[0, 0]\}{α[2,1]:αR}\{\alpha [2, 1] : \alpha \in \Bbb{R}\}의 부분공간이고 {α[2,1]:αR}\{\alpha [2, 1] : \alpha \in \Bbb{R}\}R2\Bbb{R}^2의 부분공간입니다. 한펀 R2\Bbb{R}^2R3\Bbb{R}^3의 부분공간이 아닙니다. 왜냐하면 R2\Bbb{R}^2는 2-벡터들의 집합이고 R3\Bbb{R}^3은 2-벡터들을 포함하지 않기 때문입니다.