ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ Python ] 선형대수학 X 파이썬 | 선형 결합과 선형 독립성
    Study/Python 2025. 3. 14. 22:30

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

     

     

    선형 가중 결합


     선형 가중 결합(linear weighted combination)이란 변수마다 가중치를 곱해서 합하는 연산을 뜻한다.
    선형 가중 결합은 여러 방면에서 사용되는데, 먼저 통계 모델로부터 최소제곱 알고리즘을 통해 계산되는 회귀변수(regressor), 계수(가중치, 스칼라)의 선형 결합으로 예측된 데이터가 생성되는 경우가 있다.
    차원 축소 과정에서 각 성분은 성분의 분산을 최대화 하는 계수(가중치, 스칼라)와 데이터 채널의 선형 가중 결합으로 도출된다. 또 인공 신경망(딥러닝)에서도 사용된다.
    이처럼 선형 결합은 여러 방면에서 기본적으로 사용되므로 매우 중요한 개념이다. 이는 벡터 부분공간행렬 공간을 생성하고, 선형 독립성의 핵심이다.

     

    $$W = \lambda_1v_1+\lambda_2v_2+\cdot\cdot\cdot+\lambda_nv_n$$

     

     위 식에서 모든 벡터 $v$의 차원은 같고, $\lambda$ 는 임의의 실수이다(0 포함).
    다음 코드는 선형 결합의 예시를 보여준다.

    import numpy as np
    
    l1 = 1
    l2 = 2
    l3 = 3
    v1 = np.array([ 4,5,6 ])
    v2 = np.array([ -7,8,-9 ])
    v3 = np.array([ 2,1,-3 ])
    w = l1*v1 + l2*v2 + l3*v3
    
    print(w)
    
    
    '''
    >> [ -4 24 -21 ]
    '''

     

     

    선형 독립성

     독립성은 집합 내의 개별 벡터의 속성이 아닌 벡터 집합의 속성이다. 따라서 벡터 집합은 선형 종속적(linearly dependent)이거나 선형 독립적(linearly independent)일 수 있다.
    벡터 집합에서 적어도 하나의 벡터를 집합에 있는 다른 벡터들이 선형 결합으로 나타낼 수 있으면 그 벡터 집합을 선형 종속적이라고 한다.
    반대로 집합에 있는 벡터들의 선형 결합으로 집합 내의 어떠한 벡터도 표현할 수 없다면 그 벡터 집합을 선형 독립적이라고 한다.

    선형 독립성을 알기 위해서는 벡터 집합으로 행렬을 만들고 행렬의 계수를 계산한 뒤, 다음 행의 수와 열의 수 중에서 더 작은 값과 비교한다.

    선형 종속적이라면 집합 내 벡터들의 선형 결합으로 영벡터를 만들 수 있다. (단 적어도 하나의 $\lambda\neq0$)
    반대로 영벡터를 생성할 수 없다면 벡터 집합은 선형 독립적이다.

     

    $$\textbf{0}=\lambda_1v_1+\lambda_2v_2+\cdot\cdot\cdot+\lambda_nv_n,\; \lambda \in \mathbb R$$

     

    위 식에서 단 적어도 하나의 $ \lambda \neq 0$  이라는 조건을 스칼라 중 하나로 나누어 나타내면 다음과 같은 식을 만들 수 있다.

     

    $$ \textbf {0}=v_1+\cdot\cdot\cdot+\frac{\lambda_n}{\lambda_1}v_n,\; \lambda \in \mathbb R,\; \lambda_1\neq0$$

     

    영벡터에 스칼라를 곱하면 여전히 영벡터이므로 항상 선형 종속적이다.


    파이썬으로 구현하기

     

     zip()을 이용해 위 선형 결합 예시 코드를 다음과 같이 나타낼 수 있다.

    import numpy as np
    
    l1 = 1
    l2 = 2
    l3 = 3
    v1 = np.array([ 4,5,6 ])
    v2 = np.array([ -7,8,-9 ])
    v3 = np.array([ 2,1,-3 ])
    
    scalars = [ l1,l2,l3 ]
    vectors = [ v1,v2,v3 ]
    
    # 선형 결합 초기화
    linCombo = np.zeros(len(v1))
    
    # zip()을 이용하여 선형 가중 결합 구현
    for s,v in zip(scalars,vectors):
      linCombo += s*v
    
    print(linCombo)

     

    만약 scalars의 값이 vectors보다 더 있으면 어떻게 될까?

    import numpy as np
    
    l1 = 1
    l2 = 2
    l3 = 3
    v1 = np.array([ 4,5,6 ])
    v2 = np.array([ -7,8,-9 ])
    v3 = np.array([ 2,1,-3 ])
    
    # 스칼라 집합에 하나를 더 추가했다.
    # 코드를 실행시키면 인덱스 오류가 뜬다.
    scalars = [ l1,l2,l3,3 ]
    vectors = [ v1,v2,v3 ]
    
    linCombo = np.zeros(len(v1))
    
    for i in range(len(scalars)):
      linCombo += scalars[i]*vectors[i]

     

제목 없는 코딩 블로그