brunch

You can make anything
by writing

C.S.Lewis

by 라인하트 Jan 31. 2021

머신러닝 옥타브 실습(6-3): 서포트 벡터 머신 구현

   온라인 강의 플랫폼 코세라의 창립자인 앤드류 응 (Andrew Ng) 교수는 인공지능 업계의 거장입니다. 그가 스탠퍼드 대학에서 머신 러닝 입문자에게 한 강의를 그대로 코세라 온라인 강의 (Coursera.org)에서 무료로 배울 수 있습니다. 이 강의는 머신러닝 입문자들의 필수코스입니다. 인공지능과 머신러닝을 혼자 공부하면서 자연스럽게 만나게 되는 강의입니다. 


Programming Exercise 6: 

Support Vector Machine (서포트 벡터 머신) 


1. Support Vector Machine (서포트 벡터 머신)  


1.2 SVM with Gaussian Kernels (가우시안 커널과 SVM)


1.2.3 Example Dataset 3 (데이터 셋 3) 


   In this part of the exercise, you will gain more practical skills on how to use a SVM with a Gaussian kernel. The next part of ex6.m will load and display a third dataset (Figure 6). You will be using the SVM with the Gaussian kernel with this dataset.

   In the provided dataset, ex6data3.mat, you are given the variables X, y, Xval, yval. The provided code in ex6.m trains the SVM classifier using the training set (X, y) using parameters loaded from dataset3Params.m.

   Your task is to use the cross validation set Xval, yval to determine the best C and σ. parameter to use. You should write any additional code nec- essary to help you search over the parameters C and σ. For both C and σ, we suggest trying values in multiplicative steps (e.g., 0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30). Note that you should try all possible pairs of values for C and σ (e.g., C = 0.3 and σ = 0.1). For example, if you try each of the 8 values listed above for C and for σ2, you would end up training and evaluating (on the cross validation set) a total of 82 = 64 different models.

   After you have determined the best C and σ parameters to use, you should modify the code in dataset3Params.m, filling in the best parameters you found. For our best parameters, the SVM returned a decision boundary shown in Figure 7.


   이번 실습에서 가우시안 커널과 함께 SVM을 사용하는 실용적인 방법을 설명합니다. ex6.m 파일은 그림 6과 같은 3 번째 데이터를 로드합니다. 데이터 셋에 가우시안 커널과 함께 SVM을 적용할 것입니다. 

    ex6data3.mat 파일은 변수 X, y, Xval, yval을 제공합니다. ex6.m 파일은 dataset3Params.m 파일에서 제공하여 SVM 분류기는 학습 셋 (X, y)를 학습합니다. 

   교차 검증 셋 Xval, yval을 사용하여 파라미터 C 및 σ의 최적 값을 결정합니다. 파라미터 C와 σ를 찾는 코드를 작성하고 C와 σ 모두 곱셈 (예, 0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30)으로 시도합니다. C와 σ에 대한 모든 값의 쌍을 시도합니다. 즉, 8개 값을 각각 시도하면 총 8 X 8 = 64개의 모델을 학습하고 교차 검증 셋에서 평가합니다. 

   최적의 파라미터 C와 σ를 결정한 후 dataset3Parms.m의 코드를 수정합니다. 최적의 값은 그림 7과 같은 결정 경계를 반환합니다. 




< Part 6: 데이터 셋 3 시각화>


(1) 데이터 업로드


clear ;             % 옥타브 프로그램에 모든 변수를 제거

close all;         % 터미널 이외의 창을 닫음

clc                   % 터미널을 깨끗이 정리 


load ('ex6data3.mat');    % 옥타브 프로그램으로 데이터 업로드 



(2) 옥타브 프로그램의 변수 확인


   ex6data3.mat 파일에 업로드된 파일 확인


>> whos

Variables in the current scope:


   Attr Name        Size                         Bytes  Class

   ==== ====        ====                        =====  =====

        X                   211x2                       3376  double

        Xval              200x2                       3200  double

        y                   211x1                       1688  double

        yval              200x1                       1600  double


Total is 1233 elements using 9864 bytes



(2) 데이터 그리기


clear; close all; clc;

load('ex6data3.mat');


plotData(X,y);



수평축과 수직축의 값을 조정하여 그림 6과 비슷하게 만듭니다. 


axis ([-0.6 0.3 -0.8 0.6])




< Part 7: RBF 커널로 SVM 학습하기>


(1) 데이터 업로드


clear ;             % 옥타브 프로그램에 모든 변수를 제거

close all;         % 터미널 이외의 창을 닫음

clc                   % 터미널을 깨끗이 정리 


load ('ex6data3.mat');    % 옥타브 프로그램으로 데이터 업로드 



(2) dataset3Params.m 파일 분석


function [C, sigma] = dataset3Params(X, y, Xval, yval)

%DATASET3PARAMS 파라미터 C와 sigma의 최적 값을 학습을 하기 위해 

%     SVM with RBF 커널을 활용 

%     [C, sigma] = DATASET3PARAMS(X, y, Xval, yval) 

%     교차 검증 셋에 기반한 최적의 값을 가진 변수 C와 sigma 를 반환


% 다음 변수를 반환 

C = 1;

sigma = 0.3;


% ====================== YOUR CODE HERE ======================

% Instructions: 교차 검증 셋에서 확인한 최적의 C와 sigma 학습 파라미터를 반환

%               교차 검증 셋에서 레이블을 예측하기 위해 svmPredict.m 파일을 사용

%               예,  predictions = svmPredict(model, Xval);

%

%  Note: 예측 오차를 계산할 때 다음 코드 활용 

%              mean(double(predictions ~= yval))

%





% ===================================================================


end



(3) 최적의 파라미터 sigma와 C 값을 찾기


   문제에서 C와 sigma 값으로 사용할 8개의 값을 제한했습니다.  


C_test = [ 0.01 0.03 0.1 0.3 1 3 10 30];

sigma_test = [ 0.01 0.03 0.1 0.3 1 3 10 30];


   C_test와 sigma_test의 각 성분은 8 개이고, 모든 경우의 수에 model 값을 계산하기 위해 이중 for 루프를 사용합니다. 


for i = 1: length(C_test)

   for j = 1:length(sigma_test)

       (가우시안 커널을 이용하여 SVM 학습을 위해 svmTrain.m 파일을 적용)

       (예측을 위해 svmPredict.m 파일을 적용)

       (예측값과 실제값 yval과 비교하여 다른 값들의 평균 계산) 

   end

end


   각 단계의 파일은 실제 작성하거나 이미 분석하였습니다. 


for i = 1: length(C_test)

   for j = 1:length(sigma_test)

      model = svmTrain(X, y, C_test(i), @(x1, x2) gaussianKernel(x1, x2, sigma_test(j))); 

      predictions = svmPredict(model, Xval);

      predictions_error(i,j) = mean(double(predictions ~= yval));

   end

end


   옥타브 프로그램은 64개 모델을 계산하고, 이 값을 predictions_error 행렬에 저장합니다.


Training ........................................................................ Done!

....

Training ...................................................................................... Done!


   예측값과 실제 yval의 값을 비교하여 평균값은 predictions_error에 저장하였습니다. predictions_error는 8 X 8차원 행렬입니다. 


>> predictions_error

predictions_error =


 Columns 1 through 6:

   0.565000   0.060000   0.045000   0.145000   0.180000   0.180000

   0.565000   0.060000   0.045000   0.140000   0.185000   0.180000

   0.565000   0.060000   0.045000   0.085000   0.170000   0.185000

   0.565000   0.060000   0.035000   0.065000   0.130000   0.185000

   0.565000   0.065000   0.030000   0.065000   0.075000   0.150000

   0.565000   0.080000   0.040000   0.080000   0.100000   0.090000

   0.565000   0.080000   0.070000   0.070000   0.095000   0.075000

   0.565000   0.080000   0.060000   0.070000   0.105000   0.065000


 Columns 7 and 8:

   0.180000   0.180000

   0.180000   0.180000

   0.185000   0.185000

   0.185000   0.185000

   0.185000   0.185000

   0.185000   0.180000

   0.160000   0.185000

   0.095000   0.185000


   predictions_error 값에서 가장 낮은 최소값을 찾습니다. 


>> min(predictions_error)

ans =


 Columns 1 through 6:

   0.565000   0.060000   0.030000   0.065000   0.075000   0.065000


 Columns 7 and 8:

   0.095000   0.180000


>> min(min(predictions_error))

ans =  0.030000


   최소값을 optimal_value에 저장합니다. 


optimal_value = min(min(predictions_error));


   predictions_error 8 X 8차원 행렬에서 optimal_value 값이 있는 인덱스를 반환받습니다.


[i j] = find(predictions_error == optimal_value);


>> [i j] = find(predictions_error == optimal_value);

>> i

i =  5

>> j

j =  3


 C와 sigma 값을 반환합니다.


C = C_test(i);

sigma = sigma_test(i);

 


(4) 파일에 코드 적기 



function [C, sigma] = dataset3Params(X, y, Xval, yval)

%DATASET3PARAMS 파라미터 C와 sigma 의 최적 값을 학습을 하기 위해 

%     SVM with RBF 커널을 활용 

%     [C, sigma] = DATASET3PARAMS(X, y, Xval, yval) 

%     교차 검증 셋에 기반한 최적의 값을 가진 변수 C와 sigma를 반환


% 다음 변수를 반환 

C = 1;

sigma = 0.3;


% ====================== YOUR CODE HERE ======================

% Instructions: 교차 검증 셋에서 확인한 최적의 C와 sigma 학습 파라미터를 반환

%               교차 검증 셋에서 레이블을 예측하기 위해 svmPredict.m 파일을 사용

%               예,  predictions = svmPredict(model, Xval);

%

%  Note: 예측 오차를 계산할 때 다음 코드 활용 

%              mean(double(predictions ~= yval))

%


C_test = [ 0.01 0.03 0.1 0.3 1 3 10 30];

sigma_test = [ 0.01 0.03 0.1 0.3 1 3 10 30];


for i = 1: length(C_test)

   for j = 1:length(sigma_test)

      model = svmTrain(X, y, C_test(i), @(x1, x2) gaussianKernel(x1, x2, sigma_test(j))); 

      predictions = svmPredict(model, Xval);

      predictions_error(i,j) = mean(double(predictions ~= yval));

   end

end


optimal_value = min(min(predictions_error));

[i j] = find(predictions_error == optimal_value);

C = C_test(i);

sigma = sigma_test(j);


% ===================================================================


end


(5) 최적 값으로 SVM을 학습하고 도식화 



model= svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma));

visualizeBoundary(X, y, model);



   문제와 같이 처리하기 위해 수평축과 수직축의 좌표를 재조정합니다.


axis ([-0.6 0.3 -0.8 0.6])


 


(6) submit



매거진의 이전글 머신러닝 옥타브 실습(6-2): 서포트 벡터 머신 구현
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari