ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ Python ] 선형대수학 X 파이썬 | 벡터공간(부분공간, 생성)과 기저
    Study/Python 2025. 3. 29. 23:50

    군 내에서 아이패드, 사지방 컴퓨터를 이용하여 작성함. 본 내용은 자기개발 목적으로 책 '개발자를 위한 실전 선형대수학-한빛미디어', 유튜브 등을 참고하였음
     
     

    벡터공간(Vector Space)


     벡터공간이란 체$F$에서의 벡터공간$V$가 아래 8가지 조건을 만족하는 연산(합과 스칼라 곱)을 가지는 집합이다. 표기할 때 $F$-벡터공간$V$라 쓴다.
    쉽게 말해서, 덧셈과 스칼라곱의 연산을 정의할 수 있고 특정 조건을 만족하는 집합이다. 벡터(원소)들의 집합을 우리는 벡터공간(Vector Space)이라 부른다.

    * 합(Sum) 스칼라 곱(Scalar Multiplication)의 정의
    합이란 $V$의 두 원소 $x, y$에 대해 유일한 원소 $x + y \in V$ 를 대응하는 연산이다. 이때 $x+y$를 $x$와 $y$의 합이라고 한다.
    스칼라 곱이란 체$F$ 의 원소 $a$와 벡터공간 $V$의 원소 $x$마다 유일한 원소 $ax \in V$를 대응하는 연산이다. 이때 $ax$를 $a$와 $x$의 스칼라 곱이라고 한다.
     
    * 벡터공간이 되기 위한 조건 8가지

    • 덧셈에 대한 교환법칙 | 모든 $x, y \in V$에 대하여 $x + y = y + x$이다.
    • 덧셈에 대한 결합법칙 | 모든 $x, y \in V$에 대하여 $(x + y) + z = x + (y + z)$이다.
    • 항등원의 존재 | 모든 $x \in V$에 대하여 $x + 0 = x$인 $0 \in V$이 존재한다.  
    • 역원의 존재 | 각 $x \in V$마다 $x + y = 0$을 만족하는 $y \in V$가 존재한다.
    • 벡터의 분배법칙 | 각 $x \in V$에 대하여 $1x = x$이다.
    • 스칼라의 분배법칙 | 모든 $a, b \in F$와 모든 $x \in V$에 대하여 $(ab)x = a(bx)$이다.
    • 스칼라의 결합법칙 | 모든 $a \in F$와 모든 $x, y \in V$에 대하여 $a(x + y) = ax + ay$이다. 
    • 항등법칙 | 모든 $a, b \in F$와 모든 $x \in V$에 대하여 $(a + b)x = ax + bx$이다.

    따라서 위 조건만 만족하면 벡터공간이라 할 수 있는 것이다.
     

    부분공간과 생성

     $F$-벡터공간$V$의 부분집합$W$가 $V$에서 정의한 합과 스칼라 곱을 가진 $F$-벡터공간일 때, 이를 $V$의 부분공간(Subspace)이라 한다. 즉 부분공간은 덧셈과 스칼라 곱셉으로 닫혀 있는 부분집합이며 공간의 원점을 포함한다. 이는 벡터 집합 내의 벡터들을 가중치를 사용해서 무한히 선형 결합하는 방식으로 만들어진다.
     그리고 가능한 모든 선형 결합을 구성하는 메커니즘 자체(집합)를 벡터 집합의 생성(Span)이라 한다.
     
    * 부분집합 포함 관계

    • 부분집합은 영벡터를 포함한다.
    • 부분집합에 속한 $u, v$에 대해 $u+v$도 부분집합에 속한다.
    • 부분집합에 속한 $u$와 상수 $c$에 대해 $cu$도 부분집합에 속한다.

     

    다음과 같은 하나의 벡터를 가진 벡터 집합이 있다.

    $$V = \left\{\begin{bmatrix}1\\3 \end{bmatrix}\right\}$$ 

    이 벡터 집합의 생성(Span)은 집합 내의 벡터들의 선형 결합으로 만들 수 있는 무한한 벡터이므로 다음과 같이 표현할 수 있다.

    위 벡터 집합의 생성을 나타낸 그래프.

    보라색 선은 해당 벡터 집합의 생성을 나타낸 것이다.
     


    다음 벡터 집합은 3차원 공간에 두 벡터를 가진 집합이다.

    $$V=\left\{\begin{bmatrix}0 \\1 \\3 \end{bmatrix},\begin{bmatrix}1 \\-1 \\2 \end{bmatrix}\right\}$$

    생성되는 부분공간은 3차원 공간에서 2차원 평면이다.
    두 벡터를 0으로 조절하면 영벡터가 되기에, 이 평면은 원점을 통과하게 된다.
     

    위 벡터 집합의 생성을 나타낸 그래프.

     


    다음 벡터 집합은 3차원 공간에 두 벡터를 가진 집합이지만 특이점이 있다.

    $$V=\left\{\begin{bmatrix}1 \\1 \\1 \end{bmatrix},\begin{bmatrix}2 \\2 \\2 \end{bmatrix}\right\}$$이 벡터 집합 내의 한 벡터가 이미 다른 벡터의 생성 안에 존재하기에 생성 입장에서 이는 중복이다.
     

    위 벡터 집합의 생성을 나타낸 그래프.

     

     위와 같은 예시를 통해 생성 부분공간의 차원과 집합의 벡터 수 사이에 관계를 정의할 수 있다.
    벡터 집합에서 생성되는 부분공간의 차원은 선형 독립 집합을 형성하는 데 필요한 최소한의 벡터 수이다.
    따라서 벡터 집합이 선형 독립적이면 해당 집합의 벡터들로 생성된 부분공간의 차원은 집합의 벡터 수 와 동일하다. 종속적이라면 반드시 해당 벡터들로 생성된 부분공간의 차원은 해당 집합의 벡터 수보다 작다. 행렬 계수를 통해 집합의 벡터 개수와 생성되는 부분공간의 차원 사이의 관계를 알 수 있다.
     


     

    기저(Basis)

     

     벡터 공간의 기저란 특정 부분공간을 생성하는 선형 독립인 벡터의 집합이다. 기저가 어떤 부분공간의 기저가 되려면 해당 부분공간을 생성할 수 있어야 된다.(특정 부분공간 생성) 또 벡터 집합 내에서 생성할 수 있는 여러 선형 결합 계수들은 엄청나게 많으므로 모든 벡터가 기저 집합 내에서 고유한 좌표를 가져야 한다.(선형 독립적) 즉 이 두 조건을 만족해야 해당 부분공간의 기저란 것이다.

     가장 일반적인 기저 집합은 데카르트 좌표계 즉, XY평면이다. 2차원과 3차원에서 표준 기저 집합(Standard basis set)이라 불리는 밑 두 기저 집합을 사용한다. 이 집합 내 벡터는 서로 직교하며 단위 길이로 되어 있다.

     

    $$S_2=\left\{\begin{bmatrix}1 \\0 \end{bmatrix},\begin{bmatrix}0 \\1 \end{bmatrix}\right\}\quad S_3=\left\{\begin{bmatrix}1 \\0 \\0\end{bmatrix},\begin{bmatrix}0 \\1 \\0 \end{bmatrix}, \begin{bmatrix}0 \\0 \\1 \end{bmatrix}\right\}$$ 

     

     이 기저 집합만 있다는 게 아니다. 가장 일반적일 뿐이고 기저 집합은 다르게 표현될 수 있다. 즉 기저 집합에 따라 기술 시 더 간결하고 직관적으로 표현할 수 있다. 

     

     다음과 같이 $\mathbb{R^2}$의 다른 기저 집합 $T$가 있다고 하자.

     

    $$T=\left\{\begin{bmatrix}-2 \\1 \end{bmatrix},\begin{bmatrix}2 \\1 \end{bmatrix}\right\}$$

     

     이 기저 집합 $T$와 $S_2$는 동일한 부분 공간인 $\mathbb{R^2}$ 전체를 생성한다.

    이때 $S_2$보다 $T$를 선호하게 되는 경우가 있다. 점 p, q가 존재할 때 그래프로 나타내면 다음과 같다.

    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.grid(True)         # 그래프에 격자 추가하기
    plt.plot(2,1,'ko',label='dot p')    # (2,1)에 검은 원 그리기
    plt.plot(-4,2,'ks',label='dot q')   # (-4,2)에 검은 원 그리기
    plt.plot([1,0],[0,0],'r-',label='basis S')    # 기저 S를 빨간 선으로 그리기
    plt.plot([0,0],[1,0],'r-')
    plt.plot([2,0],[1,0],'b--',label='basis T')   # 기저 T를 빨간 선으로 그리기
    plt.plot([-2,0],[1,0],'b--')
    plt.xlim([-5,5])      # 축 범위 설정
    plt.ylim([-5,5])
    
    plt.legend()          # 범례 표시하기

    그래프로 나타낸 모습

     기저 집합 $S$에서 두 좌표는 $p=(2,1)$, $q=(-4,2)$이다. 두 좌표 $p$, $q$를 기저벡터의 선형 결합으로 표현하면, 점$p$는 $2s_1+1s_2$이고, 점$q$는 $-4s_1+2s_2$이다.

    하지만 이를 기저 집합 $T$로 표현하면, 두 좌표는 $p=(1,0)$, $q=(0,2)$에서 점$p$는 $1t_1+0t_2$ 이고, 점$q$는 $0t_1+2t_2$가 된다. 즉 $p=t_1,q=2t_2$라 할 수 있다. 따라서 기저에 따라 더 간결하고 직관적으로 표현할 수 있다.

     

     

     다음은 파이썬로 부분공간이 벡터들이 생성하는 모든 선형 결합으로 만들어졌다는 것을 부분공간에 무작위로 점을 찍어 증명할 것이다. 2차원 공간에서 벡터 (1, 2)만을 가지고 있는 벡터 집합 $V$를 정의하고, 각 축의 -4와 +4사이에서 균일하게 120개의 점을 그릴 것이다.

    import matplotlib.pyplot as plt
    import numpy as np
    
    V = np.array([1,2]) 		# 벡터 집합 V 정의
    xlim = [-4,4]			# x축 범위 제한
    
    # 범주 안에서 랜덤으로 스칼라값 부여
    scalars = np.random.uniform(low=xlim[0],high=xlim[1],size=120)
    
    plt.figure(figsize=(6,6)) 	# 그래프 생성
    
    # 무작위로 점 찍기
    for s in scalars:
      p = V*s
      plt.plot(p[0],p[1],'ko')
    
    plt.xlim(xlim)
    plt.ylim(xlim)
    plt.grid()
    plt.savefig('Figure_02_07a.png',dpi=300)
    plt.show()

    2차원 공간에서 주어진 조건을 만족한다.

     

     

     다음으로 3차원에서 두 벡터 (2, 1, 3)과 (0, 5, 1)를 가지는 벡터 집합 $T$를 정의하고, 각 축의 -4와 +4 사이에서 120개의 점을 균일하게 그릴 것이다.

    import matplotlib.pyplot as plt
    import numpy as np
    import plotly.graph_objects as go
    
    # 3차원 내의 두 벡터 정의
    t1 = np.array([ 3,5,1 ])
    t2 = np.array([ 0,2,2 ])
    
    xlim = [-4,4]
    
    # x축 범위의 랜덤 스칼라 부여
    scalars = np.random.uniform(low=xlim[0],high=xlim[1],size=(120,2))
    
    
    # 무작위 점 생성
    points = np.zeros((120,3))
    for i in range(len(scalars)):
    
      # 두 벡터의 선형 가중 결합
      points[i,:] = t1*scalars[i,0] + t2*scalars[i,1]
    
    
    # 평면에 점 찍기
    fig = go.Figure( data=[go.Scatter3d(x=points[:,0], y=points[:,1], z=points[:,2], mode='markers', marker=dict(size=6,color='black') )])
    
    fig.update_layout(margin=dict(l=0,r=0,b=0,t=0))
    plt.savefig('Figure_02_07b.png',dpi=300)
    fig.show()

    3차원 공간에서 주어진 조건을 만족한다.

     

제목 없는 코딩 블로그