Logistic Regression with Octave

2019. 2. 4. 18:21Artificial Intelligence

Programming Exercise 2 : Logistic Regression


이번 프로그래밍 과제에서는 Octave를 이용하여 Logistic Regression을 모델링하고

실제 데이터를 이용해서 결과를 분석해야 했다.


구현해야 할 함수들은 다음과 같았다.



<미리 구현되어 실행한 결과를 시각적으로 활용할 수 있도록 도와주는 파일>


ex2.m - Octave/MATLAB script that steps you through the exercise 

ex2 reg.m - Octave/MATLAB script for the later parts of the exercise 

ex2data1.txt - Training set for the first half of the exercise 

ex2data2.txt - Training set for the second half of the exercise 

submit.m - Submission script that sends your solutions to our servers 

mapFeature.m - Function to generate polynomial features 

plotDecisionBoundary.m - Function to plot classifier’s decision boundary


<코딩을 통해 구현해야 하는 파일>


[] plotData.m - Function to plot 2D classification data
[] sigmoid.m - Sigmoid Function
[] costFunction.m - Logistic Regression Cost Function
[] predict.m - Logistic Regression Prediction Function
[] costFunctionReg.m - Regularized Logistic Regression Cost



1. plotData.m

주어진 X벡터와 y벡터값을 가지고 그래프를 그려 GUI를 사용해 시각적으로 보여주는 함수이다.

plot이라는 function이 이미 Octave 내에 구현되어 있으므로, 이 함수를 실행하고, 함수의 legend와 labeling을 해주고

plotting 할 데이터를 올바르게 집어넣어주면 간단하게 구현할 수 있다.


function plotData(X, y)

%PLOTDATA Plots the data points X and y into a new figure 

%   PLOTDATA(x,y) plots the data points with + for the positive examples

%   and o for the negative examples. X is assumed to be a Mx2 matrix.


% Create New Figure

figure; hold on;


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

% Instructions: Plot the positive and negative examples on a

%               2D plot, using the option 'k+' for the positive

%               examples and 'ko' for the negative examples.

%



% Find indices of Positive and Negative examples

pos = find(y == 1); neg = find(y == 0);


% Plot examples

plot(X(pos, 1), X(pos, 2), 'k+', 'LineWidth', 2,'MarkerSize',7);

plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y', 'MarkerSize', 7);


xlabel('Exam 1 score')

ylabel('Exam 2 score')

legend('Admitted', 'Not amitted')

hold off;


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




hold off;


end



2. sigmoid.m

sigmoid 함수는 정의 그대로 적어주기만 하면 되기 때문에 그리 구현하는데 어려움을 느끼진 않을 부분이였다.

Octave는 exp() 함수를 통해 exponential 값을 바로 구할 수 있으니 이를 응용하면 된다.


function g = sigmoid(z)

%SIGMOID Compute sigmoid function

%   g = SIGMOID(z) computes the sigmoid of z.


% You need to return the following variables correctly 

g = zeros(size(z));


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

% Instructions: Compute the sigmoid of each value of z (z can be a matrix,

%               vector or scalar).



g = 1./(1+exp(-1*z));

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


end




3. costFunction.m

costFunction의 정의에 맞추어 함수를 정의해주기만 하면 된다. 행렬의 곱셈이 아니라 원소끼리의 곱셈이므로 곱할때에 .을 반드시 붙여주어야 한다.



function [J, grad] = costFunction(theta, X, y)

%COSTFUNCTION Compute cost and gradient for logistic regression

%   J = COSTFUNCTION(theta, X, y) computes the cost of using theta as the

%   parameter for logistic regression and the gradient of the cost

%   w.r.t. to the parameters.


% Initialize some useful values

m = length(y); % number of training examples


% You need to return the following variables correctly 

J = 0;

grad = zeros(size(theta));


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

% Instructions: Compute the cost of a particular choice of theta.

%               You should set J to the cost.

%               Compute the partial derivatives and set grad to the partial

%               derivatives of the cost w.r.t. each parameter in theta

%

% Note: grad should have the same dimensions as theta

%


J = (-1/m) * sum(y.*log(sigmoid(X*theta)) + (1-y).*log(1-sigmoid(X*theta)));

temp = sigmoid(X*theta);

error = temp - y;

grad = (1/m) * (X' * error);


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


end



4. predict.m

predict 함수는 Regularized 된 theta의 값을 X에 대입하여 가설 함수의 값을 구한 다음, 그 값이 0.5 이상이면 1이라 예측하고, 0.5 이하이면 0이라 예측하는 함수이다. 따라서 round()함수를 이용하여 sigmoid 함수의 결과값을 반올림 해주면 조건문의 사용없이 간단하게 구현할 수 있다.


function p = predict(theta, X)

%PREDICT Predict whether the label is 0 or 1 using learned logistic 

%regression parameters theta

%   p = PREDICT(theta, X) computes the predictions for X using a 

%   threshold at 0.5 (i.e., if sigmoid(theta'*x) >= 0.5, predict 1)


m = size(X, 1); % Number of training examples


% You need to return the following variables correctly

p = zeros(m, 1);


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

% Instructions: Complete the following code to make predictions using

%               your learned logistic regression parameters. 

%               You should set p to a vector of 0's and 1's

%


p = round(sigmoid(X*theta));


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



end



5. costFunctionReg.m

costFunctionReg 함수는 cost와 gradient를 logistic regression과 Regularization을 이용하여 구하는 함수이다.

Regularization은 costFunction이 지나치게 복잡해져서 Overfitting이 일어나는 것을 막기 위해 차수가 높은 파라미터의 theta값에 대해서 lambda만큼의 제약을 걸어 그 영향력을 조절하는 방식이다. 구하는 식은 아래와 같다.


function [J, grad] = costFunctionReg(theta, X, y, lambda)

%COSTFUNCTIONREG Compute cost and gradient for logistic regression with regularization

%   J = COSTFUNCTIONREG(theta, X, y, lambda) computes the cost of using

%   theta as the parameter for regularized logistic regression and the

%   gradient of the cost w.r.t. to the parameters. 


% Initialize some useful values

m = length(y); % number of training examples


% You need to return the following variables correctly 

J = 0;

grad = zeros(size(theta));


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

% Instructions: Compute the cost of a particular choice of theta.

%               You should set J to the cost.

%               Compute the partial derivatives and set grad to the partial

%               derivatives of the cost w.r.t. each parameter in theta


tempTheta = theta;

tempTheta(1) = 0;


J = (-1/m) * sum(y.*log(sigmoid(X*theta))+(1-y).*log(1-sigmoid(X*theta)));

J = J + ((lambda)/(2*m))*(sum(tempTheta.^2));


temp = sigmoid(X*theta);

error = temp - y;

grad = (1/m) * (X' * error) +(lambda/m)*tempTheta;



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


end


반응형

'Artificial Intelligence' 카테고리의 다른 글

Neural Networks(2)  (0) 2019.02.07
Neural Networks (1)  (0) 2019.02.07
MachineLearning - The Problem of OverFitting  (0) 2019.02.03
MachineLearning - Classification(3)  (0) 2019.02.03
MachineLearning - Classification(2)  (0) 2019.02.01