인공지능수학 5주차

wi_label·2021년 12월 21일
1

Graduate school

목록 보기
8/17

과제 목표

파이썬 numpy 패키지를 이용해 1) 좌표계 변환과 2) 표준행렬을 이용해 선형변환을 수행하는 코드를 작성합니다.

import numpy as np
import numpy.linalg

1) 좌표계 변환

3-벡터 v\mathbf{v}가 표준좌표계에서 다음과 같이 표현된다고 한다.

v=[344]\mathbf{v} = \left[ \begin{array}{rrr} 3 \\ 4 \\ 4 \end{array} \right]

다음의 두 벡터 v1\mathbf{v}_1v2\mathbf{v}_2를 기저벡터로 하는 새로운 좌표계를 도입했을 때, 3-벡터 v\mathbf{v}의 좌표값을 구하고자 한다.

v1=[131],v=[122]\mathbf{v}_1 = \left[ \begin{array}{rrr} 1 \\ 3 \\ 1 \end{array} \right], \quad \mathbf{v} = \left[ \begin{array}{rrr} 1 \\ -2 \\ 2 \end{array} \right]

이를 해결하는 numpy 코드를 작성하시오.

문제 정의

이 문제는 다음 수식을 만족하는 x1x_1, x2x_2를 구하면 해결되는 문제이다.

x1[131]+x2[122]=3[100]+4[010]+4[001]=[344]x_1 \left[ \begin{array}{rrr} 1 \\ 3 \\ 1 \end{array} \right] + x_2 \left[ \begin{array}{rrr} 1 \\ -2 \\ 2 \end{array} \right] = 3 \left[ \begin{array}{rrr} 1 \\ 0 \\ 0 \end{array} \right] + 4 \left[ \begin{array}{rrr} 0 \\ 1 \\ 0 \end{array} \right] + 4 \left[ \begin{array}{rrr} 0 \\ 0 \\ 1 \end{array} \right] = \left[ \begin{array}{rrr} 3 \\ 4 \\ 4 \end{array} \right]

즉, 새로운 좌표계의 좌표값은 (x1,x2)(x_1, x_2)가 된다.

이 문제를 선형시스템으로 표현하면 다음과 같다.

[v1v2][x1x2]=[v]\left[ \begin{array}{cc} | & | \\ \mathbf{v}_1 & \mathbf{v}_2 \\ | & | \end{array} \right] \left[ \begin{array}{rr} x_1 \\ x_2 \end{array} \right] = \left[ \begin{array}{c} | \\ \mathbf{v} \\ | \end{array} \right]

벡터 및 행렬 정의

3-벡터 v\mathbf{v}v1\mathbf{v}_1, v2\mathbf{v}_2를 기저벡터로 하는 좌표계 3x2 행렬 AA를 정의한다.

이 때, numpy.column_stack를 이용해 v1\mathbf{v}_1, v2\mathbf{v}_2가 순서대로 행렬 AA의 열(column)이 되도록 구성한다.

v  = np.array((3,4,4))

v1 = np.array((1,3,1))
v2 = np.array((1,-2,2))

A = np.column_stack((v1, v2))

print(A)
print(v)

선형시스템 정의 및 풀기

Ax=vA \mathbf{x} = \mathbf{v}

이 문제는 행렬 AA가 3x2 크기로 정방행렬(square matrix)가 아닙니다. 이 경우는 최소제곱법을 이용한 최적화로 선형시스템의 해를 구할 수 있습니다. [참고자료: 링크]

(* 최소제곱법에 관한 이론은 추후 학습할 예정입니다.)

x = np.linalg.lstsq(A, v, rcond=None)[0]

print(x)

2) 표준행렬을 이용한 선형 변환

2차원 벡터를 입력으로 받아, 해당 벡터를 반시계방향으로 6060^\circ 만큼 회전하는 기능을 구현해 보자.

문제 정의

우리가 구하고자 하는 변환은 2차원 입력(xR2\mathbf{x} \in \mathbb{R}^2)을 받아 2차원 출력(xlR2\mathbf{x}_l \in \mathbb{R}^2)을 내는 선형변환(linear transformation)이다.

따라서, 해당 기능(function)은 2x2 행렬 AA로 구현할 수 있다.

2x2 행렬 AA의 첫번째 열(column)은 다음과 같이 구성할 수 있다.

  • 2차원 공간의 첫번째 기저(basis)벡터인 (1,0)이 해당 기능에 의해 어디로 변환되는지를 계산해 v1\mathbf{v}_1으로 설정한다.
  • 2차원 공간의 두번째 기저(basis)벡터인 (0,1)이 해당 기능에 의해 어디로 변화되는지를 계산해 v2\mathbf{v}_2으로 설정한다.

2x2 행렬 AA을 다음과 같이 구성하는 numpy 코드를 작성한다.

A=[v1v2]A = \left[ \begin{array}{cc} | & | \\ \mathbf{v}_1 & \mathbf{v}_2 \\ | & | \end{array} \right]
v1 = np.array((1, 0))
v2 = np.array((0, 1))

A = np.column_stack((v1, v2))

print(A)

선형변환 수행

아래의 2-벡터를 각각 입력으로 받아 선형변환을 수행하는 코드를 작성하시오.

x1=[10],x2=[32]\mathbf{x}_1 = \left[ \begin{array}{rrr} 1 \\ 0 \end{array} \right], \quad \mathbf{x}_2 = \left[ \begin{array}{rrr} 3 \\ -2 \end{array} \right]
x1 = np.array((1, 0))
x2 = np.array((3, -2))

y1 = np.linalg.lstsq(A, x1, rcond=None)[0]
y2 = np.linalg.lstsq(A, x2, rcond=None)[0]

print(y1)
print(y2)
profile
옥은 부서질 지언정 흰 빛을 잃지 않고, 대나무는 불에 탈 지언정 그 곧음을 잃으려 하지 않는다.

0개의 댓글