본문 바로가기
Dev/Coursera - Machine Learning

[Coursera ML] [2주차 복습] Octave Tutorial

by 아임웬디 2020. 2. 10.

한창 열심히 듣다가 바빠져서 잠시 안들었더니, 계속 우선순위에서 밀려 이제야 다시 시작해보려고 한다.

다른건 읽기 자료로 다 정리되어 있어서 배웠던 부분들이 금방 백업됬는데 튜토리얼부분은 없어서 내가 직접 정리하기로 결심했다. 이번을 토대로, 가능하면 강의 들을 때마다 이렇게 정리해놓으려고 한다. 수동적으로 강의나 읽기자료로 던져주는 걸 받아먹기보다 능동적으로 나도 함께 수업을 들어야 좀 더 기억에 오래 남을 것 같아서! (항상 노트에 정리하면서 공부하는 내 습관 때문이기도 하다)

 

1. Basic Operations

Octave를 사용하는 이유 : 프로토타입하기에 좋아서. 그리고 Octave는 오픈소스!

 

1) Variables

기본 연산자 : + - * / ^

% : 주석

논리연산자 : == != && || xor(a,b)

프롬프트 형식 바꾸기 : PS1(바꾸고자 하는 형식); ex. PS1('>>');

; : 결과 출력하지 않도록 함 ex. a = 3; 하면 a = 3 출력 안하고 다음 명령받음

true : 1

'' : String

disp() : 출력함수

  ex) disp(sprintf(' 2 decimals: %0.2f', pi)) : C에서 출력하는 방식과 유사 소수점 아래 2자리

  cf) pi : pi 자체가 파이값을 담고 있음

format long/short : 출력하는 것의 기본값 설정

 

2) Vector / Matrix

행렬 만들기 : ; 기준으로 행나눔

A = [ 1 2; 3 4; 5 6 ]

>> A = 1  2

           3  4

           5  6

row vector : [ 1 2 3 ] / column vector [ 1; 2; 3]

v = 1:0.1:2 : 1부터 0.1씩 증가하면서 2에 도달할 까지 행 벡터 만듦

v = 1:6 : 1씩 증가가 기본

>> v = 1  2  3  4  5  6

ones(a,b) : 모두 1을 값으로 가진 axb 행렬을 생성

  2 * ones(a,b) 도 가능 - 모든 값에 2를 곱한 행렬

zeros(a,b) : 모두 0을 값으로 가진 axb 행렬을 생성

rand(a,b) : 랜덤한 값(0~1 사이의 실수)을 값으로 가진 axb 행렬을 생성

randn(a,b) : 평균이 0이고 분산/표준편차가 1인 가우스 분포로부터의 값으로 axb 행렬을 생성

sqrt(a) : a의 루트값

hist(a) :  a에 대한 히스토그램 생성 

hist(a, 50) : 막대 50개로 히스토그램 그림

eye(a) : axa 단위 행렬 생성

  ex) ans = eye(4) 

  >> ans =

          1  0  0  0

          0  1  0  0

          0  0  1  0

          0  0  0  0

help 명령어 : 명령어에 대한 설명

 

2. Moving Data Around

size(a) : a 변수가 담은 1x2 행렬 형태로 크기를 나타냄

size(a,1) / size(a,2) : a의 첫번째 열 / 두번째 열

  ex) a = 3x2 행렬

  >> ans = 

      3  2

length(a) : 행과 열의 개수 중 더 차원이 큰 값 반환

  ex) 위의 예시 그대로, length(a)

  >> ans = 3

 

- 리눅스 명령어와 동일 

pwd :  현재 위치

cd : 위치 이동

ls : 문서 탐색

 

load 파일명 / load('파일명') : 파일에 있는 데이터 불러오기

who : 현재 Octave 메모리 상에서 정의되어 있는 변수

whos : who의 detail한 정보를 보여줌

clear 변수명 : 변수 지우기

a(1:10) : 처음 10개의 원소 slicing

save 파일명 변수명 : 파일로 저장

.mat : 데이터를 binary 형식으로 저장

.text : 사람이 읽을 수 있는 형식으로 저장, 이 경우 변수명 다음에 -ascii 써야함

 

- 인덱싱

A(a,b) : a행 b열의 있는 값

A(a, :) : a행에 있는 모든 값

A(:, a) : a열에 있는 모든 값

  cf) ":" : 행이나 열에 해당하는 모든 요소

A([a b], :) : a 또는 b 행과 모든 열

  ex) A = [ 1 2 ; 3 4; 5 6 ]일 때, A([1 3], :)

  >> ans = 1  2

               5  6

A(:,a) = [열벡터] : a열에 있는 값을 열벡터 값으로 대체

  ex) A(:,2) = [1; 2; 3]

a = [a, [열벡터]] : a행렬에 오른쪽으로 열벡터 append

변수명(:) : 모든 원소를 하나의 벡터로 담음. 즉, 하나의 열로 만듦

c = [a b] / [a, b] : a행렬에 b 행렬을 옆으로 추가

  ex) A = [ 1 2; 3 4 ] B = [ 11 12; 13 14 ]일 때, C = [ A B ]

  >> C = 1  2  11  12

             3  4  13  14

c = [a; b] : a행렬 밑에 b 행렬을 추가

 

3. Computing on Data

a * b : 행렬의 기본 곱셈

a .* b : 행렬의 원소 단위 곱셈 

  ex) A = [ 1 2; 3 4 ] B = [ 11 12; 13 14 ]일 때, A .* B

  >> ans = 11  24

               39  56 

  +) . : 원소 단위 계산으로 .^ ./ 등으로 활용 가능

log(a) : 원소 단위의 로그값 계산

exp(a) : 오일러(e)의 계승 값

abs(a) : 절대값으로 변환

-a / -1*a : -로 값 변환

a + 1 / a + ones(length(a),1) : 원소 값 1씩 증가

a' : a의 전치행렬 (tranpose). 행과 열을 바꿈

  ex) (a')' = a

       a = [ 1 2; 3 4; 5 6] -> a' = [ 1 3 5 ; 2 4 6 ]

 

max(a) / max(a,[],1) : 열 단위로 최대값

max(a,[],2) : 행 단위로 최대값

val = max(a) / max(max(a)) / max(a(:)) : 행렬 내의 최대값

[val, ind] = max(a) : 행렬 내의 최대값, 최대값의 인덱스

max(rand(3),rand(3)) : 랜덤한 3x3 행렬에서 원소 단위의 최대값 반환

 

비교문 ex) a < 3 : 원소 단위의 연산으로, 비교문이 참이면 1 거짓이면 0으로 원소값 설정

find(비교문) : 비교문에 true인 원소들의 인덱스를 알려줌

  ex) a = [1  4  0.5  2]

  >> a < 3

  ans = 1  0  1  1

  >> find(a<3)

  ans = 1  3  4

 

magic(n) : nxn의 마방진 행렬

  cf) magic square(마방진) : 모든 행과 열, 대각선의 합계 같음

sum(a) : 모든 원소의 합

sum(a,1) : 열 단위의 합 / sum(a,2) : 행 단위의 합

+) sum(sum(a .* eye(n)) / sum(sum(a .* flipud(eye(n)))  : 대각선의 합

  cf) flipud : flip-updown. 단위 행렬을 반대 대각선으로 만들 수 있음

prod(a) : 모든 원소의 곱 

floor(a) : 소수점 버림

ceil(a) : 소수점 올림

pinv(A) : 역행렬

 

4. Plotting Data

plot(x,y) : x와 y 축으로 plot 그림

plot(x,y, 'color') : 그래프 색 설정 가능

  ex) 'r' : red

  cf) sin() / cos() 함수

hold on : 현재 상태 잠시 멈추고 명령어 입력

xlabel('str') / ylabel('str') : x축, y축 라벨

legend('str1','str2') : 그래프의 오른쪽 위에 함수별로 라벨

title('str') : 타이틀 붙이기

print -dpng 'name.png' : 그래프 png 파일로 저장

close : 그래프 창 닫기

 

- 숫자를 부여해서 여러 그래프 그리기

figure(1); plot(x,y); : 첫번째 그래프

figure(2); plot(x,y); : 두번째 그래프

 

subplot(a,b,c) : axb grid에 c번째에 위치 시키겠다. 그 위치에 그래프 그리려면 plot(x,y) 그 다음 입력

  ex) subplot(1,2,1) : 1x2 grid의 1번째 (왼쪽)

axis([x시작, x끝, y시작, y끝]) : x축과 y축 범위 설정 가능

clf : clear figure

imagesc(a) : 행렬을 색으로 표현, 다른 색으로 다른 값임을 나타냄

imagesc(a), colorbar, colormap gray; : color 흑백으로 표현

  cf) ,를 사용해서 여러 명령을 한큐에! ;를 사용한다면 여러 명령을 출력없이 한큐에!

 

5. Control Statements : for, while, if statement

전반적으로 프로그래밍 언어에서 사용하는 방식과 유사하다!

- for문

ex) for i=1:10,

       v(i) = 2^i;

     end;

 

- while문

ex) while true.

       v(i) = 999;

       i = i+1;

       if i == 6,

          break;

       end;

     end;

 

- if문

ex) if v(1) == 1,

       disp('The value is one');

    elseif v(1) == 2,

       disp('The value is two');

    else

       disp('The value is two');

    end;

 

exit/quit/q : Octave 종료

 

addpath('파일이 있는 경로') : 'C:\'로 search path 경로 설정 

 

6. Vectorization

Octave

C++

- Gradient descent (* Simultaneous update이 중요)

지난번에 세운 vectorization 식 : u = 2v + 5w 로 사용

 

 

 

댓글