Flux in Julia/Learning Julia (Intro_to_Julia)

11. Basic linear algebra (한글)

딥스탯 2018. 10. 4. 15:23
11_Basic_linear_algebra(한글)

Basic linear algebra in Julia

원저자: Andreas Noack Jensen (MIT) (http://www.econ.ku.dk/phdstudent/noack/) (with edits from Jane Herriman)

출처

https://github.com/JuliaComputing/JuliaBoxTutorials/tree/master/introductory-tutorials/intro-to-julia (github : JuliaComputing/JuliaBoxTutorials/introductory-tutorials/intro-to-julia/)

Topics:

  1. 기본 연산
  2. 라이브러리 LinearAlgebra
  3. 연습문제

함께보기

먼저, 랜덤 행렬을 정의해보자.

In [1]:
A = rand(1:4,4,4)
Out[1]:
4×4 Array{Int64,2}:
 4  4  1  1
 1  4  3  3
 4  4  4  4
 3  4  4  2

1로 이루어진 벡터도 정의하자.

In [2]:
x = fill(1.0, (4,)) # = fill(1.0, 4)
Out[2]:
4-element Array{Float64,1}:
 1.0
 1.0
 1.0
 1.0

A는 type이 Array{Int64,2}이고, x는 type이 Array{Float64,1} 라는 것을 볼 수 있다. Julia는 Vector{Type}=Array{Type,1}, Matrix{Type}=Array{Type,2} 로 별명(alias)을 정의하고있다.

많은 기본 연산은 다른 언어와 같다.

행렬곱(Multiplication)

In [3]:
b = A*x
Out[3]:
4-element Array{Float64,1}:
 10.0
 11.0
 16.0
 13.0

전치(Transpose)

다른 언어들처럼, A' 는 켤레전치(conjugate transpose)행렬이다.

In [4]:
A'
Out[4]:
4×4 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
 4  1  4  3
 4  4  4  4
 1  3  4  4
 1  3  4  2

또는 아래처럼 전치(transpose)행렬을 구할 수 있다.

In [5]:
transpose(A)
Out[5]:
4×4 LinearAlgebra.Transpose{Int64,Array{Int64,2}}:
 4  1  4  3
 4  4  4  4
 1  3  4  4
 1  3  4  2

전치 후 곱셈

Julia는 *를 쓰지 않아도 된다.

In [6]:
A'A
Out[6]:
4×4 Array{Int64,2}:
 42  48  35  29
 48  64  48  40
 35  48  42  34
 29  40  34  30

선형계(linear systems) 풀기

A 가 정방(square)행렬 일 때, Ax=b는 함수 \ 로 풀 수 있다.

In [7]:
A\b
Out[7]:
4-element Array{Float64,1}:
 1.0
 1.0
 1.0
 1.0
In [8]:
A^-1 * b
Out[8]:
4-element Array{Float64,1}:
 0.9999999999999996
 1.0000000000000004
 1.0               
 0.9999999999999991

만약 과결정선형계(overdetermined linear system) (A 가 아래로 긴 행렬)일 때, A\b최소 제곱 해(least squares solution)를 도출한다.

In [9]:
Atall = rand(4, 2)
Out[9]:
4×2 Array{Float64,2}:
 0.620125  0.964271
 0.435129  0.392623
 0.352525  0.846371
 0.888477  0.154265
In [10]:
Atall\b
Out[10]:
2-element Array{Float64,1}:
 12.558191782805045
  7.886509151359657
In [11]:
(Atall'Atall)^-1 * Atall'b
Out[11]:
2-element Array{Float64,1}:
 12.55819178280504 
  7.886509151359654

만일 계수 부족 최소제곱 문제(rank-deficient least squares problem)인 경우는, 최소 노름 최소 제곱 해(minimum norm least squares solution)를 도출한다.

In [12]:
v1 = rand(4)
v2 = rand(4)
rankdef = hcat(v1, v1, v2)
Out[12]:
4×3 Array{Float64,2}:
 0.791797  0.791797  0.631865
 0.132592  0.132592  0.468963
 0.421476  0.421476  0.177085
 0.967094  0.967094  0.202275
In [13]:
rankdef\b
Out[13]:
3-element Array{Float64,1}:
  5.49389774957956 
  5.493897749579558
 11.26631347260693 

또한, 결정미달계(underdetermined system)(A가 아래로 짧은 행렬) 인 경우, Julia는 최소 노름 해(minimum norm solution)를 도출한다.

In [14]:
bshort = rand(2)
Ashort = rand(2, 3)
Out[14]:
2×3 Array{Float64,2}:
 0.913861   0.382365  0.542242
 0.0607539  0.420378  0.750087
In [15]:
Ashort\bshort
Out[15]:
3-element Array{Float64,1}:
 0.279885521561581  
 0.37741831223794353
 0.6366857785894317 

라이브러리 LinearAlgebra

선형 대수학의 대부분은 기본적으로 Julia에서 사용할 수 있지만 (위에서 본 것 처럼), LinearAlgebra라는 표준 라이브러리가 있으며, 더 많은 관련된 이름과 함수를 제공한다. 특히, 인수 분해(factorization) 및 일부 구조화된 행렬(structured matrix) type을 제공한다. 다른 패키지와 마찬가지로, using LinearAlgebra로 session에 이러한 추가 기능을 가져올 수 있다.

연습문제

10.1

v와 자신의 내적(inner product or "dot" product)를 구하자. 그리고 그 값을 dot_v에 저장하자.

In [16]:
v = [1,2,3]
Out[16]:
3-element Array{Int64,1}:
 1
 2
 3
In [17]:
dot_v = v'v
Out[17]:
14
In [18]:
using LinearAlgebra
In [19]:
dot_v = dot(v,v)
Out[19]:
14
In [20]:
dot_v = v⋅v # \cdot<tab>
Out[20]:
14
In [21]:
dot_v = (v,v) # \cdot<tab>
Out[21]:
14
In [22]:
@assert dot_v == 14

10.2

v와 자신의 외적(outer product)를 구하자. 그리고 그 값을 cross_v에 저장하자.

In [23]:
using LinearAlgebra
In [24]:
cross_v = cross(v,v)
Out[24]:
3-element Array{Int64,1}:
 0
 0
 0
In [25]:
cross_v = v×v # \times<tab>
Out[25]:
3-element Array{Int64,1}:
 0
 0
 0
In [26]:
cross_v = ×(v,v) # \times<tab>
Out[26]:
3-element Array{Int64,1}:
 0
 0
 0
In [27]:
@assert cross_v == [0, 0, 0]