본문 바로가기
머신러닝

[머신러닝 이론] 5. Octabe/Matlab 튜토리얼 - 앤드류응 강의

by jasNote 2022. 5. 28.

5. Octabe / Matlab Tutorial

실제 알고리즘 구현을 위한 프로그래밍 언어를 소개한다. 하지만 본인은 Octabe가 아닌 파이썬을 통해 소스코드를 구현했다. Octabe를 사용하시는 분들을 위한 게시물이다.

 

5.1. Basic Operation

  • 논리연산
    • 1 == 1 % ans 0
    • 1 ~= 1 % ans 1 
    • 1 && 0 % ans 0
    • 1 || 0 % ans 1
    • xor(1, 0) % ans 1
  • 프로롬프트 모양바꾸기
    • PS1(' >>')
  • 변수 지정
    • a = 3 % ans 3
    • a = 3; % 출력없음
    • a % a = 3
    • b = ‘hi’ % hi
    • c = (3 >= 1) % 1
    • a = pi %  a= 3.1416
    • disp(a); % 3.1416
    • format long % : 변수의 소수점 뒷자리를 길게 표시
    • format shot % : 변수의 소수점 뒷자리를 짧게 표시
    • sprinfs(‘2 decimals : %0.2f, a’) % 2 decimals : 3.14 
    • disp(sprinfs(‘2 decimals : %0.2f, a’)) % 6 decimals : 3.141593변수 출력
  • 행렬 생성
    • A = [1 2; 3 4; 5 6] : 3 x 2 행렬 A 생성
    • v = [1; 2; 3] : 3 x 1 벡터 v 생성
    • v = [1, 2, 3] : 1 x 3 벡터 v 생성
    • v = 1: 0.1 :2 : 1 ~ 2 까지 0.1씩 증가하는 성분 벡터 v 생성
    • v = 1:6 : 1 ~ 6 까지 1씩 증가하는 성분 벡터 v 생성
    • A = ones(2,3) :  행렬 성분이 모두 1 인 2 x 3 행렬 A 생성
    • A = 3*ones(2,3) :  행렬 성분이 모두 3 인 2 x 3 행렬 A 생성
    • w = rand(1,3) : 행렬 성분이 0~1사이의 랜덤 값인 1 x 3 벡터w 생성
    • w = randn(1,3) : 행렬 성분이 가우시안 분포 값인 1 x 3 벡터w 생성
    • I = eye(4) : 4 x 4 항등행렬I 생성
  • 그래프 그리기
    • w = -6 + sqrt(10) * randn(1, 10000) : 행령성분이 랜덤숫자 1 x 10, 000로 행렬 생성
    • hist(w) : 막대그래프 생성
    • hist(w, 50) : 50개의 막대그래프 생성

5.2. Moving Data Around

  • 행렬관리
    • size(A) % ans 3 2 : 행렬 A의 차원을 ‘행 열’로 표현
    • size(A, 1) % ans A = 2 : 행렬 A의 행의 크기
    • size(A, 2) % ans A = 3 : 행렬 A의 열의 크기
    • length(A) % ans 6 : 행렬 A의 차원중 가장 긴 값
  • 행렬 성분 관리
    • A(3, 2) % ans 6
    • A(2,:) % ans 3 4 : 2행의 모든 성분 값 반환
    • A(:,1) % ans 1 3 5 : 1열의 모든 성분 값 반환
    • A([1 3], :) % ans 1 2 ; 5 6 : 1,3 행의 성분 값 반환
    • A(:, 2) = [10;11;12] % ans : 2열의 성분 값을 [10; 11; 12]로 대체
    • A = [A, [13; 14; 15]] % ans : A값 맨 오른쪽 열에 [13 14 15] 추가
    • A(:) % ans 1 2 3 4 5 6 : 열 벡터로 변환
    • C = [A B] % ans : 좌 우로 연결
    • C = [A; B] % ans : 상 하로 연결
  • 데이터 관리
    • load featuresX.txt % : 파일을 현재 디렉토리로 업로드
    • save hello.mat v % : 변수v의 값을 .mat파일로 저장
    • save hello.txt v -ascii % : 변수v의 값을 아스키형식으로 저장
  • 변수 및 함수 관리
    • who % : 현재 사용 중인 변수를 나열
    • whos % : 현재 사용 중인 변수를 상세나열
    • clear v % : v 변수제거
    • clear % : 모든변수 제거

5.3. Computing on Data

  • 행렬계산
    • A . * B : 같은 위치의 성분끼리 곱셈 (행렬 크기 같아야함)
    • A .^ 2 : 각 성분 값에 제곱
    • 1 . / v : 각 성분을 역수로 만듬
    • log(v) : 값에 밑이 자연로그 적용
    • log10(v) : 값에 밑이 상용로그 적용 
    • abs(v) : 절대값

 

  • 행렬관리
    • max(A) : 행렬 성분 중 최대값
    • max(A,[],1) : 행렬 각 열의 최대값
    • max(A,[],2) : 행렬 각 행의 최대값
    • A’ : 전치행렬
    • find(A > 5) : 행렬A 성분 중 5 보다 큰 값의 위치
    • magic(4) : 4x4 마방진 행렬
    • [r,c] = find(A > 5) : 행렬A 모든 성분중 5 보다큰 값 성분 위치
    • sum(A, 1) : 행렬A 열의 모든 합
    • prod(v) : 벡터 v 모든 값 곱
    • floor(v) : 내림
    • ceil(v) : 올림
    • flipud(A) : 행 뒤집기
    • pinv(A) : 역행렬

5.4. Plotting Data

  • 도식화
    • plot(t, y1) : 수평축t, 수직축y1 도식화
    • hold on : 기존 그래프에 새로운 그래프 추가
    • plot(t, y2, ‘r’) : 수평축t, 수직축y2 빨간색 그래프 도식화
    • xlabel(time‘) : x축 라벨
    • ylabel(‘value’) : y축 라벨
    • legned(‘sin’, ‘cos’) : 그래프 별 범례
    • title(‘my plot’) : 중앙에 제목 표시
  • 그래프관리
    • print -dpng ‘myplot.png’ : .png파일로 저장
    • close : 그래프 창 닫음
    • clf : 그래프 창에서 그래프 지움
    • figure(1); plot(t, y1) : figure1 이름으로 첫번쨰 그래프창
    • figure(2); plot(t, y1) : figure1 이름으로 두번쨰 그래프창
    • subplot(1,2,1) : 1x2로 분할 후 왼쪽에 삽입 (subplot 실행 후 plot 적용)
    • subplot(1,2,2) : 1x2로 분할 후 오른쪽에 삽입 (subplot 실행 후 plot 적용)
    • axis([0 5 -1 1]) : startX endX startY endY 범위 설정
    • imagesc(t) : 색넣기

5.5. Control Statements : for, while, if

  • for
v = zeros(10,1)		: 10x1 벡터v 생성
for i = 1:10,		: 1 ~ 10 반복
	v(i) = 2^i;	: 벡터v 성분에 값을 2^i 승으로 입력
end;			: 루프종료
	
index = 1:10		: 1~10 벡터v 생성
for i = index,		: 1~10 반복
	disp(i);		: i 값 표시
end;
  • while
i=1		
while i <=5		: i 가 5보다 크면 종료
	v(i) = 100;	: 벡터v에 성분 입력
	i = i+1;		: 변수 i를 1증가 시킴
end;
  • if
v(1) = 2;			
if v(1) == 1,
	disp(‘value 1’);
elseif v(2)==2,
	disp(‘value 2’);
else,
	disp(‘valuse is not 1 or 2’);
end;

 

5.5. Vectorization

선형대수 및 수치 관련 라이브러리를 활용하면 코드는 줄어들고 빨라진다. 수학 공식을 프로그래밍 할때 일반 프로그래밍과 옥타브에서 지원하는 라이브러리를 사용한 프로그래밍의 소스 차이를 확인해본다

 

임의의가설 표현 비교 

  • Hθ(x)
    • = θ0x0 + θ1x1 + θ2x2 + θ3x3 + θ4x4 +... + θnxn (일반 함수 식)
    • = θ^T* X  (행렬 표현)
// 일반프로그래밍
prediction = 0.0;
for j = 1: n+1;
	prediction = prediction + theta(j) * x(j)
end;

// 옥타브 라이브러리
prediction = theta' * x