본 글은 코세라(Coursera)에서 제공되고 있는 스탠포트 대학교
머신러닝(Machine Learning)을 수강하면서 일부 내용을 정리한 것입니다.
강의 사이트: https://www.coursera.org/learn/machine-learning
옥타브 설치는 아래 글을 참조하시기 바랍니다.
수치계산을 위한 오픈소스 프로그래밍 언어 '옥타브(Octave)' 설치하기
http://blog.daum.net/geoscience/828
앞으로 총 7개의 옥타브 프로그래밍 튜토리얼을 글로 연재할 예정입니다.
그 첫번째로 기본 연산(Basic Operations) 기능들에 대해 살펴 보도록 하겠습니다.
일단, 옥타브를 GUI 방식으로 실행하고 기초 수학 연산(+, -, *, /)을 입력해 보겠습니다.
>> 5+6 ans = 11 >> 3-2 ans = 1 >> 5*8 ans = 40 >> 1/2 ans = 0.50000 >> 2^6 ans = 64
이번에는 논리 연산(==, ~=, &&, ||, xor())을 입력해 보겠습니다.
A == B는 A와 B가 같다면 1, 아니면 0,
A ~= B는 A와 B가 같지 않다면 1, 아니면 0,
A && B는 AND 비트 연산으로 A와 B 모두 1일 때에만 1, 아니면 0,
A || B는 OR 비트 연산으로 A와 B 중 하나라도 1이 있다면 1, 아니면 0,
그리고 xor(A, B)는 XOR 비트 연산으로 A와 B가 다르면 1, 같으면 0이 되겠습니다.
>> 1 == 2 ans = 0 >> 1 ~= 2 ans = 1 >> 1 && 0 ans = 0 >> 1 || 0 ans = 1 >> xor(1, 0) ans = 1
이번에는 옥타브 변수(variables)들에 대해 학습해 보겠습니다.
먼저, %는 옥타브에서 주석(comment)으로 사용되며, 세미콜론(;)은 값의 출력을 생략할 수 있습니다.
disp()는 값을 보여주는 함수, sprintf()는 문자열을 반환하는 출력 함수로써 아래와 같이 쓰일 수 있습니다.
format은 다양한 선택을 통해 값을 출력할 수 있는데요, 'help format'을 입력하시면 도움글을 확인하실 수 있습니다.
>> % Octave variables >> a=3 a = 3 >> a=3; >> a=pi; >> disp(a) 3.1416 >> disp(sprintf('2 decimals: %0.2f', a)) 2 decimals: 3.14 >> disp(sprintf('2 decimals: %0.6f', a)) 2 decimals: 3.141593 >> format long >> a a = 3.14159265358979 >> format short >> a a = 3.1416
자, 이제 행렬(matrix)에 대해 살펴 보도록 하겠습니다. 아래와 같이 3×2 행렬을 만들어 볼 수 있는데요,
>> A = [1 2; 3 4; 5 6] A = 1 2 3 4 5 6 >> A = [1 2; 3 4; 5 6] A = 1 2 3 4 5 6
아래와 같이 행 벡터(row vector)와 열 벡터(column vector)도 정의할 수 있습니다.
>> v = [1 2 3] v = 1 2 3 >> v = [1; 2; 3] v = 1 2 3
이번에는 1과 2 사이에 0.1 만큼 값을 증가시키며 만든 행 벡터인데요, 따로 값이 지정되어 있지 않으면 1만큼 증가합니다.
>> v = 1:0.1:2 v = 1.0000 1.1000 1.2000 1.3000 1.4000 1.5000 1.6000 1.7000 1.8000 1.9000 2.0000 >> v = 1:6 v = 1 2 3 4 5 6
자, 이번에는 값이 모두 1인 행렬을 만들고 각 값에 2만큼 곱해 보겠습니다. 앞서 학습한 행렬 정의와 결과가 같죠?!
>> ones(2, 3) ans = 1 1 1 1 1 1 >> C = 2*ones(2, 3) C = 2 2 2 2 2 2 >> C = [2 2 2; 2 2 2] C = 2 2 2 2 2 2
한편, 임의 값을 가진 행렬을 만드는 함수로는 rand()와 randn()가 있는데요,
randn()는 평균이 0, 분산이 1인 가우시안 분포(Gaussian distribution) 값을 생성합니다.
>> w = ones(1, 3) w = 1 1 1 >> w = rand(1, 3) w = 0.021795 0.579260 0.683103 >> w= randn(1, 3) w = 0.076710 -1.024125 -0.924268
이번에는 아래와 같이 -6에 1과 10,000 사이에 임의 값과 10의 제곱근의 곱을 더해보도록 하겠습니다.
그리고 그 결과를 hist() 함수를 통해 표출해 보면 다음과 같습니다.
>> w = -6 + sqrt(10)*(randn(1, 10000)); >> hist(w)
등간격 구간인 빈(bin)을 아래와 같이 50개로 조정할 수도 있습니다.
>> hist(w, 50)
끝으로 대각행렬(diagonal matrix)는 eye() 함수를 통해 정의할 수 있습니다. 간단하죠?!
아래와 같이 주대각선 상에 있지 않은 원소들이 모두 0인 정사각행렬을 쉽게 만들 수 있습니다.
>> eye(4) ans = Diagonal Matrix 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1