필립 클라인의 저서 코딩 더 매트릭스 4장 벡터공간.
- 선형결합과 Span을 알아봅니다.
- 기하 객체 flat을 알아 보고 flat을 표현하는 두 가지 방법을 알아봅니다.
- 벡터공간의 성질을 알아보고 벡터들의 생성으로서, 해집합으로서 이 성질들을 만족하는지 알아봅니다.
선형결합
벡터 이 있을때 이들의 선형결합은 다음과 같이 표현됩니다.
는 스칼라이고 선형결합에서 이들을 계수라고 합니다. 만약 선형결합에서 모든 계수가 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개의 새우깽을 생산한다면 새우깽 하나를 생산하는데 필요한 원료량은 벡터 을 스칼라곱한 입니다. 선형결합을 이용해 과자 하나를 생산하는데 필요한 원료량 와 생산량 스칼라 를 곱해 더하면 각각의 원료의 필요한 전체 양을 구할 수 있습니다. 위의 프로세스를 코드로 작성해 보겠습니다.
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)
벡터들 의 모든 선형결합으로 이루어진 집합을 이 벡터들의 생성이라 하고 라고 씁니다. 각각의 는 생성자라 합니다. Span을 이해하는 가장 좋은 방법은 직접 생성자들과 그들로 이루어지는 Span을 그려보는 것입니다. 두 3-벡터 의 Span은 라고 쓰고 이것은 3차원 공간에서 평면을 그려냅니다. 이 평면이 원점을 지날 때 평면의 방정식을 구해보겠습니다. 두 벡터 생성자의 법선벡터를 구할 수 있다면 법선벡터와 평면 위의 한 점을 알게되므로 평면의 방정식을 쓸 수 있습니다. 법선벡터는 두 벡터의 외적으로 구합니다.
평면의 방정식에 이를 적용하면 를 구할 수 있습니다. 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)라고 합니다.
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) 상의 벡터들을 포함하고
sum_count
가 3이라면 아래와 같은 선형결합들을 만들어냅니다.
벡터들의 집합에 대한 기하적 구조
상의 두 벡터의 생성은 평면 또는 평면보다 차원이 낮은 객체 (직선 또는 점)입니다. 임의의 벡터들의 집합에 대한 생성은 원점을 포함해야 합니다. 모든 계수가 인 자명한 선형결합이 포함되기 때문입니다.
- 영벡터들의 생성은 점(영차원 객체)을 형성합니다. 이것은 원점입니다.
- 하나의 벡터의 생성은 원점을 지나는 직선(1차원 객체) 또는 어떤 점, 즉 원점을 형성합니다.
- 두 벡터의 생성은 원점을 지나는 평면(2차원 객체), 또는 원점을 지나는 직선, 또는 점, 즉 원점을 형성합니다.
점, 직선, 평면과 같은 기하적 객체를 flat이라 부릅니다. 물론 4차원 공간 에서 3차원 flat을 정의할 수 있습니다.
앞에서 예시로 그렸던 평면은 두 벡터의 생성으로서 로 표현했었습니다. 이 표현은 다음과 같이 집합으로 표현할 수도 있습니다.
따라서 평면은 우변이 인 선형방정식의 해집합입니다. 여기서 우변이 인 선형방정식을 동차 선형방정식이라 하고 동차 선형방정식의 컬렉션을 동차 선형시스템이라 합니다.
앞으로 flat을 나타낼 때
- 어떤 벡터들의 생성으로서
- 동차 선형시스템의 해집합으로서
표현함으로서 필요에 따라 유용하게 사용할 수 있습니다.
벡터공간
정의역 와 공역 에 대해 의 부분집합 는 가 상의 어떤 D-벡터들의 생성이든지 혹은 선형시스템의 해가 되든지 상관없이 다음 3가지 성질들을 가지고 있습니다.
- 는 영벡터를 포함합니다.
- 모든 벡터 에 대해 가 를 포함하면 모든 스칼라 에 대해 는 를 포함합니다.
- 모든 벡터들의 쌍 에 대해 만약 가 를 포함하면 는 를 포함합니다.
첫번째 벡터들의 생성 경우부터 증명해 보겠습니다. 먼저 가 일때
- 생성자들 각각에 스칼라 을 곱하고 선형결합하면 이고 이것은 영벡터입니다.
- 임의의 생성자 에 임의의 스칼라 를 곱하고 나머지 생성자에 을 곱해 선형결합하면 이고 이는 에 포함됩니다.
- 은 생성자들의 모든 선형결합으로 이루어지므로 집합 중 임의의 벡터 와 의 선형결합 는 에 포함됩니다.
위의 증명들은 모두 가 어떤 D-벡터들의 생성이기 때문에 가능합니다.
두번째 선형시스템의 해집합인 경우도 증명해 보겠습니다. 가 일때
- 이므로 영벡터는 해집합의 원소입니다.
- 임의의 스칼라 에 대해 이므로 는 해집합의 원소입니다.
- 를 만족하는 해 , 에 대해
벡터들의 집합 가 위의 세가지 성질을 만족하면 벡터공간이라고 합니다. 특히 영벡터만으로 구성된 벡터공간은 자명한 벡터공간이라고 합니다.
부분공간
와 가 벡터공간이고 가 의 부분집합이면 는 의 부분공간이라고 합니다. 예를 들어 의 유일한 부분공간은 그 자신입니다. 집합 은 의 부분공간이고 은 의 부분공간입니다. 한펀 은 의 부분공간이 아닙니다. 왜냐하면 는 2-벡터들의 집합이고 은 2-벡터들을 포함하지 않기 때문입니다.