Programmers 인공지능 데브코스 - Week 2 Day 2

donchanee·2020년 12월 8일
0

😃[2주차 - Day3]😃

행렬분해(matrix decomposition)의 의미

인수분해는 어떤 경우에 쓸모가 있나요?

  • 분수의 약분
  • 두 수의 최소공배수 구하기
  • 두 수의 최대공약수 구하기
  • 결과적으로 수를 두 수의 곱으로 변환하는 것이 여러모로 응용이 되는데, 이를 행렬에 적용한 것이 행렬분해의 의미입니다.

    주어진 행렬을 행렬분해 한 상태로 가지고 있자는 것이 행렬분해입니다. 이렇게 한다면 계산이 굉장히 편해질 경우가 많습니다.

    행렬분해에는 대표적인 3가지의 분해방법이 있는데 다음과 같습니다.

  • LU 분해
  • QR 분해
  • 특이값 분해
  • LU 분해

    LU 분해는 가우스 소거법을 행렬형태로 분해한 것입니다. 예시로, 주어진 행렬을 아래의 형태를 가지는 두 행렬의 곱으로 나누는 행렬분해입니다.

    주어진 행렬 A가 LU 분해되어 있으면 장점은 무엇일까요?

    LU분해가 되었다는 뜻은 Ax=b 문제를 아래와 같이 나타낼 수 있습니다.

    Ax = b  =>  (LU)x = b  =>  L(Ux) = b  =>  Ly = b (단, Ux = y)

    Ax = b의 문제를 두 개의 조그만 문제로 분해하는 방법입니다.

    L은 좌하단만 의미있는 숫자가 있고, 우상단은 전부 0입니다.

    y1을 구하기는 너무나도 쉽습니다. 첫번째 식을 보면 선형방정식입니다. 이렇게 하면 이전 포스팅에 작성했던 전방대치법을 사용하여 위에서부터 아래로 y의 값을 전부 알아낼 수 있습니다.

    U의 경우도 마찬가지 입니다. L의 결과값 y를 가지고, Ux = y를 해결하면 간단하게 후방대치법을 사용하여 아래에서 위로 해결해나갈 수 있습니다.

    그러므로, A를 LU로 분해할 수만 있다면 굉장히 간단하게 답을 구할 수 있습니다. 그래서 LU 분해를 배우는 이유를 찾을 수 있습니다.

    LU 분해의 의미

    A = LU 의 형태로 분리하는 것이 LU 분해 입니다.

    LU분해는 가우스 소거법의 forward elimination(전방소거법)을 행렬로 코드화한 것입니다.

      L : 행렬 A를 전방소거하는데 쓰인 replacement와 scaling에 대한 EROs를 기록해 둔 행렬

      U : 행렬 A를 전방소거한 후 남은 upper trianglar matrix

      P : 행렬 A를 전방소거하는데 쓰인 interchange에 대한 EROs를 기록해 둔 행렬 (옵션)

    도대체 왜 LU 분해를 쓰는가?

    A의 역행렬을 구하면 Ax = b 를 x = A-1b 으로 구하면 굉장히 쉬운데, 왜 LU분해를 쓰는가?

    이는 수치적 안정성을 이유로, 역행렬 A-1을 단순하게 구하는 것 보다 PLU 분해를 이용하는 것이 수치적으로 조금 더 안정적이기 때문입니다.

    또한 b가 자주 업데이트 되는 경우, 조금 더 불안정성이 커지기 때문에 수치적 안정성이 더욱 중요해집니다.

    행렬 표기법과 관련 용어

    행렬 (Matrix)은 직사각형 구조에 숫자들을 담아놓은 구조입니다. 각 숫자들은 행렬의 요소(entry)라 부릅니다.

    아래의 그림은 3개의 행(row)2개의 열(column)으로 이뤄진 3 X 2 행렬입니다.

    하나의 행, 하나의 열을 가지는 특별한 행렬을 행벡터, 열벡터 라고 부릅니다.

    행렬 A의 각 (i, j) 요소는 aij로 나타냅니다. 또한 A = [aij]로도 나타낼 수 있고, A = [aij]m x n 로도 나타낼 수 있습니다.

    전치 행렬은 대각선으로 반전한 행렬입니다. (열 -> 행, 행 -> 열)

    벡터 표기법

    벡터라고 하면 일반적으로 열벡터(column vector)를 말합니다.

    n-벡터는 n개의 스칼라(scalar)로 구성된 벡터를 말합니다.

    영행렬 (Zero matrices)

    행렬의 모든 요소가 0이면, 해당 행렬을 영행렬(zero matrix)라 하고 O 으로 표기합니다.

    정방행렬 (Square Matrix)

    n x n 행렬을 정방행렬이라고 합니다. 행과 열의 개수가 모두 n인 정사각형 모양의 행렬을 말합니다.

    항등행렬 (Identity Matrices)

    주 대각선만 1이고, 나머지 요소는 모두 0인 n차 정방행렬 -> 항등행렬
    숫자의 1과 같은 존재로 행렬곱에 대한 항등원입니다.

    행렬의 곱

    중학교인가 고등학교에서 기본적으로 배운 행렬의 곱셈과 마찬가지인 계산입니다.

    텐서 (tensor)

    텐서는 스칼라, 벡터, 행렬을 아우르는 개념입니다. 숫자가 늘어설 수 있는 방향이 k개면 k-텐서로 부릅니다.

  • 0-텐서 : 스칼라
  • 1-텐서 : 벡터
  • 2-텐서 : 행렬
  • 그렇다면 3-텐서는 무엇일까요?

    이차원 행렬안에 각각의 요소가 벡터라면, 3-텐서입니다. 숫자가 늘어설 수 있는 방향이 세방향이기 때문입니다. 4-텐서는 영상이 시간에 따라 바뀌는 것을 묶었을 경우 등이 가능할 것입니다.

    분할행렬 (Partitioned Matrix)

    행렬을 조각 단위로 분할하여 생각하는 것입니다.

    이런식으로 2 x 2 행렬을 묶어서 하나의 A11로 생각하는 것이 분할행렬 또는 블록행렬이라고 합니다.

    행렬을 조각 단위로 봐서 연산과정이 성립하기만 한다면 전혀 무방하게 계산할 수 있다는 것입니다.

    행벡터 형태 혹은 열벡터 형태로 볼 수 있는데, 행벡터를 모으면 열벡터 형태가 되고, 열벡터 단위로 묶음을 하게 되면 행벡터같이 보입니다.

    분할행렬로 행렬의 곱 이해하기

    색깔별로 묶어보면, 쉬운 이해가 가능할 것입니다.

    행벡터와 열벡터 + 분배법칙처럼 바라보는 방식입니다.

    선형조합(Linear Combination)

    행렬은 열벡터의 리스트이다! 라고 해봅니다.

    M x N 행렬은 M-벡터가 N개 있다 라고 앞으로 생각하겠습니다.

    Ax는 행렬 A가 가지고 있는 열벡터의 선형조합입니다.

    Ax=b를 선형조합 관점에서 바라볼때,

    위와같이 열벡터의 선형 조합으로 나타낼 수 있습니다. 선형조합이란 열벡터들을 행렬의 곱처럼 시행할 경우를 말합니다.

    조금은 당연한 얘기처럼 들리지만, 이것이 선형조합이라고 합니다. 위 선형조합의 해는 x = [2 -1 3] 입니다.

    좌표계 변환

    선형시스템을 보는 새로운 관점으로 좌표계 변환이 있습니다.

    벡터는 고등학교 교과과정에서 배우게 되는데, 길이와 방향을 가진 물리량입니다. 벡터를 수학적 표현쪽으로 보았을 때, 좌표계가 있는 곳에서 배웁니다. 좌표계가 없는 곳에서 계산하는 것이 물리에서 배우는 벡터입니다.

    조금은 당연하지만, 각 축에 내린 수선의 발만큼 전진하여 찍힌 좌표가 일반적인 "좌표계"에서 2-벡터를 표현하는 방식이 될 수 있습니다.

    Ax = b를 보면, b를 기준으로 표준좌표계를 설정하고,
    x = A-1b를 보면, x를 기준으로 표준좌표계를 설정합니다.

    예제 #1

    결과적으로, Ax = Ib (좌표계 x 좌표값 = 좌표계 x 좌표값)이라고 생각할 수 있다.

    선형변환 (Linear Transformation)

    행렬은 함수다 라는 말을 하고 싶은 용어입니다.

    선형함수

    그려봤을 때 선의 형태였다는 함수입니다. 평평하고 평면의 형태를 띄고 있다고 합니다. 이를 발견하고 수학자들이 두가지 조건을 만족하면 그려보지 않아도 선형함수임을 판별하는 방법을 찾아냈습니다. 평평한 성질을 가질 경우에만 밑의 수식을 만족합니다.

    곡선의 함수의 경우 위 조건을 만족하지 못합니다. (eg. y = 2x )

    변환

    함수의 입력이 n-벡터이고 출력이 m-벡터이면 변환이라고 하자라고 합니다.

    특별히, n=m인 경우, 해당 변환을 연산자(operator)라고 합니다.

    행렬은 n-벡터를 입력으로 받아 m-벡터를 출력으로 내는 변환으로 볼 수 있습니다.

    그런데 행렬변환은 위 사진의 선형함수의 성질을 모두 만족하기 때문에 선형변환이라고 할 수 있습니다.

    고로,

    선형변환 코딩하기

    행렬을 원하는 모양으로 디자인 하는것이 선형변환을 코딩하는 방법입니다.

    1. 구현하고자 하는 기능의 입력과 출력이 벡터로 정의되는지 확인하여야합니다.
    2. 구현하고자 하는 기능이 선형인지 확인해야 합니다.
    3. 입력이 n-벡터이고, 출력이 m-벡터이면 m x n 표준행렬을 구성합니다.

    표준행렬 구하기

    1. n-차원 표준기저벡터 {e1,e2, ... ,en}을 생각합니다.
    2. 각 n-차원 표준기저벡터 ei에 대해, 우리가 원하는 기능을 동작시켜 얻은 결과인 m-차원 벡터 T(ei)를 표준행렬의 각 열에 적습니다.

    예제 #1, #2

    변환인지 확인 후, 선형변환인지 확인합니다.
    (벡터로 입력받아 벡터로 출력하는지 확인, 선형인지 확인)

    0개의 댓글