ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ Python ] 선형대수학 X 파이썬 | 벡터와 벡터의 기본 연산(내적)
    Python 2025. 1. 19. 23:04

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


    벡터를 파이썬으로 나타내는 방법


    벡터를 파이썬으로 나타내는 방법은 여러 가지가 있다.
    리스트 타입의 벡터는 간단하지만 선형대수학 응용분야에서는 잘 쓰이지 않는다.

    asList = [1,2,3]
    asArray = np.array([1,2,3]) # 1차원 배열
    rowVec = np.array([ [1,2,3] ]) # 행
    colVec = np.array([ [1],[2],[3] ]) # 열

    위 네 가지 코드를 통해 벡터를 코드로 나타낼 수 있다.

    asArray 변수는 방향이 없는 배열로 Numpy의 숫자 1차원 리스트이다.
    바깥쪽 대괄호는 모든 숫자를 하나의 객체로 묶는다. 추가적인 내부 괄호 집합은 행을 나타낸다. 따라서 변수 colVec은 3행 1열인 열벡터이다.

    위 벡터를 출력하면,

    벡터를 출력하기 위해 코드를 작성한 모습
    위 코드의 출력값

    asArray가 1차원 배열이므로 모양이 (3, )으로 표현되지만, 방향이 부여된 벡터는 2차원 배열로 표현된다. 차수는 (행, 열)이다.



    벡터의 연산

    벡터의 덧셈

    동일한 차원의 벡터끼리만 덧셈을 할 수 있다.

    벡터 v와 w를 더한 모습.


    만약, 행벡터와 열벡터를 더하면 어떻게 될까?

    행벡터와 열벡터를 더한 모습.

    위와 같은 모습으로 파이썬에서는 Numpy 기능을 활용하여 행벡터와 열벡터를 더할 수 있다. 이를 *브로드캐스팅(broadcasting)이라고 한다.
    *브로드캐스팅(broadcasting)이란 Numpy에서 다양한 형상의 배열 간에 산술 연산을 가능하게 하는 기능이다.(현대 컴퓨터 기반 선형대수학에서만 존재한다.)
    따라서 브로드캐스팅으로 한 벡터를 다른 벡터의 각 원소로 연산을 여러 번 반복하기에, 배열의 형상이 서로 다를 경우에도 연산을 수행하여 코드를 작성할 수 있다.

    위 코드로부터,
    vPlusw 배열은 [[ 10 10 10 ] + [ 4 5 6 ],
    [ 20 20 20 ] + [ 4 5 6 ],
    [ 30 30 30 ] + [ 4 5 6 ]] 임을 알 수 있다.
    이를 통해 코드의 가독성을 높이고 효율적인 작업을 수행할 수 있다.


    스칼라와 벡터 사이의 연산

    스칼라와 벡터의 곱셈은 비교적 간단하다. 각 벡터 원소에 그저 스칼라를 곱하면 된다.
    다만 파이썬에서 별표 연산은 변수 타입에 따라 다르게 동작하기 때문에 스칼라와 벡터 사이 곱셈에서는 데이터 타입이 중요시된다.

    import numpy as np
    
    s = 3
    a = [ 3, 4, 5 ]     # 리스트
    b = np.array(a)     # np 배열
    print(a*s)
    print(b*s)
    >> [ 3, 4, 5, 3, 4, 5 ]
    >> [ 9, 12, 15 ]

    위 코드에서 처음 print 값은 리스트 타입에 스칼라를 곱했을 때 스칼라만큼 반복하는 걸 의미하고, 두 번째 값은 벡터가 Numpy 배열일 때 원소별로 곱셈을 한 결과이다.

    스칼라와 벡터의 덧셈은 선형대수학에서는 불가능하나, 파이썬과 같은 수치 처리 프로그램에서는 각 벡터 원소에 스칼라를 더할 수 있다.
    아래 코드는 스칼라와 벡터의 덧셈의 예시이다.

    import numpy as np
    
    s = 3
    v = np.array([ 3, 6 ])
    print(s + v)
    >> [ 6, 9 ]


    전치

    전치 연산은 열벡터를 행벡터, 혹은 그 반대로 변환하는 걸 뜻한다. 단순하게 행렬의 원소인 (행, 열) 인덱스를 맞바꾸는 것이다.

    전치 연산의 기호이다.

    벡터를 두 번 전치하면 벡터는 원래 방향이 된다.
    이는 간단해 보여도 데이터 과학이나 머신러닝 등에서 굉장히 중요한 증명에서 핵심 근거이다.



    벡터 크기와 단위벡터



    벡터의 크기, 즉 벡터의 기하학적 길이(또는 노름(norm)이라 불림)는 벡터의 길이 자체이며 흔히 자주 쓰는 거리 공식으로 구한다.

    벡터 v의 크기 공식.


    파이썬에서 다양한 데이터 구조의 길이나 크기를 확인할 수 있는 len() 함수를 통해 벡터의 크기를 구할 수 있다.
    따라서 이 함수는 배열의 차원을 반환하고 추가로 np.norm()은 기하학적 길이를 반환한다.

    기하학적 길이가 1인 벡터를 단위벡터라고 한다.(||v|| = 1인 벡터 v)

    부모 벡터 v와 같은 방향을 갖는다.



    벡터의 내적



    내적은 두 벡터 사이의 유사성(혹은 매핑)의 척도로 해석된다. 따라서 내적은 선형대수학 뿐만 아니라 많은 연산과 알고리즘의 기본이 된다.
    두 벡터 사이의 유사성이 높을 수록 내적은 커진다. 책에 소개된 예시를 들면, cm으로 측정된 데이터의 내적이 m로 측정된 데이터의 내적보다 클 것이다.
    이 단위의 차이는 정규화 계수로 제거할 수 있다. 이 정규화된 내적을 피어슨 상관계수라고 한다.

    본 글에서는 책에서 사용한 대로 내적을 다음과 같이 표기하겠다.

    같은 의미로 a dot b, < a, b >가 있다.

    내적은 동일한 차원에서 벡터끼리 성립하기에, 같은 차원의 두 벡터 내적은 서로 대응되는 원소끼리 곱한 다음 모든 결과를 더한다.
    내적의 기하학적 정의로는 두 벡터의 크기를 곱하고 두 벡터 사이의 각도에서 코사인값만큼 곱해준다.(이때 코사인값의 부호와 0이 되는 경우를 주의하자.)

    파이썬에서는 내적을 구현하기 위해 np.dot() 를 사용한다.

    import numpy as np
    
    v = np.array([1,2,3,4])
    w = np.array([5,6,7,8])
    
    print(np.dot(v,w))

    np.dot(v,w)의 값은 70이 나오게 된다.


    내적의 분배 법칙

    내적의 분배 법칙은 수학의 분배 법칙과 유사하다.

    내적의 분배 법칙
    import numpy as np
    
    a = np.array([0,1,2])
    b = np.array([3,5,8])
    c = np.array([13,21,34])
    
    res1 = np.dot(a,b+c)
    res2 = np.dot(a,b) + np.dot(a,c)

    위 코드는 내적의 분배 법칙을 나타낸 것이다. res1과 res2는 같은 값을 가진다.

    'Python' 카테고리의 다른 글

    [ Python ] 선형대수학 X 파이썬 | 시각화  (3) 2024.11.11
Designed by Tistory.