octave 는 MATLAB의 무료버전이라고 보면 되는데, 행렬연산에 좋은 성능을 보인다. 행렬과 관련된 대부분의 연산이 단 한 줄의 함수호출로 이루어진다. 머신러닝의 알고리즘을 구현하는 데 있어서 Python이나 R은 기본적인 변수선언이나 라이브러리 사용법을 익히고 디버깅도 어느정도 할 줄 알아야한다. 하지만 octave는 매우 직관적이고 쉬워 초보자들도 구현을 하면서 배우는것이 가능할 정도이다. 따라서 octave를 사용하면 프로그래밍 언어 자체에 신경쓰지않고 머신러닝의 개념과 구현 알고리즘 자체를 이해하는데에 집중할 수 있다.
아래의 링크를 따라가면 자신에게 맞는 운영체제별로 octave를 설치할 수 있다.
https://www.gnu.org/software/octave/download
지금부터 octave의 기본적인 명령어들을 소개하겠다.
1. Basic Operations
PS1(‘>> ‘); %% octave 프롬프트 변경
cd ‘c:/path/to/desired/directory name’ %% 작업 디렉토리 변경
3+2 %%더하기
1-4 %%빼기
3*9 %%곱하기
2/5 %%나누기
2^9 %%거듭제곱
1 == 2 %% 같으면 1, 다르면 0 반환
1 ~= 2 %% 다르면 1, 같으면 0 반환
1 && 0 %%bitwise AND 논리
1 || 0 %%bitwise OR 논리
xor(1,0) %%XOR 논리
%% 변수
a = 3; %% a라는 변수에 3 저장. 세미콜론은 실행결과를 나타내고싶지 않을 때 사용
b = ‘hi’; %%b라는 변수에 문자열 저장
c = 3>=1; %%c라는 변수에 논리연산의 결과 저장
% Displaying them:
a = pi %% a에 pi 저장 // 원주율 pi가 정의되어있음
disp(a) %% a의 값 반환
disp(sprintf(‘2 decimals: %0.2f’, a)) %% %f는 서식문자로서 실수를 나타낼 때 사용하고 0.x의 형태로 x자리수까지 표현 가능
disp(sprintf(‘6 decimals: %0.6f’, a))
format long %%실수 표현범위 long타입(소숫점 8자리)
a
format short %%실수 표현범위 short타입(소숫점 2자리)
a
%% vectors and matrices
A = [1 2; 3 4; 5 6] %% 세미콜론(;)로 행 구분
v = [1 2 3] %% 행벡터
v = [1; 2; 3] %%열벡터
v = 1:0.1:2 % 1에서 2까지 0.1단위로 커지는 element를 가지는 행벡터
v = 1:6 % stepsize가 없으면 1씩 커짐. 1~6까지의 정수가 원소인 행벡터
C = ones(2,3) %% 2행, 3열의 원소가 모두 1인 행렬. C = [1 1 1; 1 1 1]과 같음
w = ones(1,3)
w = zeros(1,3) %% 1행, 3열의 원소가 모두 0인 행렬 = 행벡터
w = rand(1,3) % 균등분포에 따라 숫자를 추출해서 1×3 행렬 정의
w = randn(1,3)% 정규분포에 따라 숫자를 추출해서 1×3 행렬 정의
hist(w) % w를 히스토그램으로 그려줌. default 막대 10개
hist(w,50) % w를 히스토그램으로 그려줌. 막대 50개로 설정
I = eye(4) % 4×4 단위행렬
% help + 함수이름 : 함수에 대한 도움말 보기
help eye
help rand
2. Moving Data Around
%% Dimension 계산
sz = size(A) % 행렬 A의 dimension을 반환(행의 수, 열의 수 모두 반환)
size(A,1) % 행의 수 반환
size(A,2) % 열의 수 반환
length(v) % 벡터의 길이 반환
%% 데이터 불러오기
pwd % 현재 디렉토리
cd ‘C:\Users\ang\Octave files’ % 디렉토리 변경
ls % 현재 디렉토리에 있는 파일 확인
load q1y.dat % q1y.dat 파일 불러오기
load (“q1y.dat”) % q1y.dat파일 불러오기
clear % 모든 변수 clear
v = q1x(1:10); % 벡터 v는 q1x 데이터들 중 처음 10개로 이루어짐
%% 행렬을 index를 사용하여 다루기
A(3,2) % 행렬A의 3행2열의 원소 반환
A(2,:) % :는 “모든” 이라는 뜻을 가짐. 이 코드는 2행의 모든 원소 = 2행 자체 반환
A(:,2) % 2열의 모든 원소 = 2열 자체 반환
A(:,2) = [10; 11; 12] % A의 2열을 10, 11, 12로 바꿈
A = [A, [100; 101; 102]]; % A의 끝 열에 [100; 101; 102] 추가
%% 행렬 추가하기
A = [1 2; 3 4; 5 6]
B = [11 12; 13 14; 15 16]
C = [A B] % A와 B를 옆으로 이어붙여 새로운 행렬 C 생성
C = [A; B] % A와 B를 위아래로 이어붙여 새로운 행렬 생성
3. Computing on Data
A = [1 2;3 4;5 6]
B = [11 12;13 14;15 16]
C = [1 1;2 2]
v = [1;2;3]
%% matrix operations
A * C % 행렬 곱
A .* B % element-wise 행렬곱
% A .* C or A * B %% 정의하지 못함. dimension이 맞지 않음
A .^ 2 % element-wise 제곱
1./v % element-wise 역수
log(v) % element-wise 로그취하기
exp(v) % element-wise 지수취하기
abs(v) % element-wise 절대값
v + 1 % 모든 원소 +1
A’ % A의 transpose(전치행렬)
%% misc useful functions
a = [1 15 2 0.5]
val = max(a) % a의 최대값 반환
[val,ind] = max(a) %a의 최대값과 그 index 반환
val = max(A) % 각 열의 최대값 반환
% sum, prod
sum(a) % a의 모든 원소의 합
prod(a) % a의 모든 원소의 곱
sum(A,1) %각 열의 원소의 합
sum(A,2) %각 행의 원소의 합
sum(sum( A .* eye(9) )) %A의 오른쪽아래 대각선방향의 원소의 합 계산
sum(sum( A .* flipud(eye(9)) )) %A의 오른쪽 위 대각선방향의 원소의 합 계산 . flipud : 행렬 위아래 뒤집기
% Matrix inverse (pseudo-inverse)
pinv(A) % inv(A’_A)_A’ %pseudo 역행렬. 그냥 역행렬이라고 생각해도 무방
4. Plotting Data
%% plotting
t = [0:0.01:0.98];
y1 = sin(2_pi_4*t);
plot(t,y1);
y2 = cos(2_pi_4*t);
hold on; % hold on 하면 기존의 그래프 없어지지 않고 그 위에 다른 그래프 추가하여 비교 가능
plot(t,y2,’r’);
xlabel(‘time’); %x축 이름
ylabel(‘value’); %y축 이름
legend(‘sin’,’cos’); % 순서대로 그려진 그래프의 이름
title(‘my plot’); %그래프 제목
print -dpng ‘myPlot.png’ %그래프 현재 디렉토리에 저장
close; % 모든 plot 끄기
figure(1); plot(t, y1); %figure1 창에 plot(t,y1)
figure(2); plot(t, y2); %figure2 창에 plot(t,y2)
subplot(1,2,1); %1×2 규격으로 그래프 칸을 나누고(1,2) // 1번째 그래프에 access
plot(t,y1);
subplot(1,2,2); %1×2 규격으로 그래프 칸을 나누고(1,2) // 2번째 그래프에 access
plot(t,y2);
5. Control Loops
v = zeros(10,1); % v = [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]
for i=1:10,
v(i) = 2^i;
end;
i = 1;
while i <= 5,
v(i) = 100;
i = i+1;
end
i = 1;
while true,
v(i) = 999;
i = i+1;
if i == 6,
break;
end;
end
if v(1)==1,
disp(‘The value is one!’);
elseif v(1)==2,
disp(‘The value is two!’);
else
disp(‘The value is not one or two!’);
end
6. Function
.m 확장자의 파일에 우리가 함수를 정의하여놓고 사용 가능. 단 파일이 현재 디렉토리에 있어야한다.
ex1)
Function y = squareNum(x); %x를 매개변수로 받아 y를 반환하는 함수
y = x^2; %y와 x의 관계식
octave커맨드창에서 squareNum(5)를 입력하면 5^2 = 25 반환
ex2)
Function [y z] = squareAndCubicNum(x); %x를 매개변수로 받아 y와 z를 반환하는 함수
y = x^2;
z = x^3;
커맨드창에서 [a b] = squareAndCubicNum(3)을 입력하면 9와 27 반환
위의 명령어들을 다 외울 필요는 없다. 그저 한 번씩 쳐보고 실행해보면서 어떠한 기능을 하는지 가볍게 파악하면 충분하다. 조만간 이 기능들을 토대로하여 실제로 Linear Regression의 기능을 구현하는 예제를 한 번 보여줄 것이다.
'AI > 머신러닝 기초' 카테고리의 다른 글
(머신러닝) 8 - Regularization (0) | 2020.05.15 |
---|---|
(머신러닝) 7 - Logistic Regression (0) | 2020.05.15 |
(머신러닝) 5 - Normal Equation (0) | 2020.05.15 |
(머신러닝) 4 - Nonlinear Model with Linear Regression (0) | 2020.05.15 |
(머신러닝) (ex) linear regression2 (0) | 2020.05.15 |