본문 바로가기
Coursera 강의/Machine Learning

[Machine Learning] Exam 2(Week 3)

by 별준 2020. 8. 11.
해당 내용은 Andrew Ng 교수님의 Machine Learning 강의(Coursera)를 정리한 내용입니다.

※ 아래에 문제 풀이가 있습니다. 원하지 않는다면 스크롤을 내리지 마세요.

 

3주차 과제는 아래와 같다.

 

 

 

 

plotData.m - classification data 그래프 그리기

sigmoid.m - Sigmoid 함수를 반환하는 코드 작성

costFunction.m - Logistic Regression의 Cost Function 코드 작성

predict.m - Logistic Regression의 예측값을 반환하는 코드 작성(0 또는 1의 값을 나타내야 한다)

costFunctionReg.m - 정규화(regularization)된 Logistic Regression의 cost와 gradient를 계산하는 코드 작성

 

코드는 아래 Github을 참조하면 된다. 풀이는 추후에 해보도록 하겠다.

https://github.com/junstar92/Coursera/tree/master/MachineLearning/ex2

 

 

아래는 풀이이다.

 

[plotData.m]

단순히 읽어들인 'ex2data1.txt'를 그래프로 표현하는 함수이다. 결과 코드는 이미 해당 파일 안에 있어서 그대로 따라하면 된다. plot함수에 대해서 좀 알아보는 시간이 된 것 같다.

코드는 아래와 같다.

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.
%
pos = find(y==1); neg = find(y == 0);
 
plot(X(pos, 1), X(pos, 2), 'k+', 'LineWidth', 2, 'MarkerSize', 7);
plot(X(neg, 1), X(neg, 2), 'ko', 'MarkerFaceColor', 'y', 'MarkerSize', 7);
 
 
% =========================================================================
 
 
hold off;
 
end

line 14를 실행하면 pos는 y가 1인 행으로 이루어진 n x 1 vector를 반환한다. neg는 y가 0은 vector를 반환한다. 

line 16, 17의 plot 함수 내부 인자 의미는 help plot 명령어를 통해서 나중에 다시 정리가 필요할 것 같다.

'k+'와 'ko'에서 'k'는 blacK을 의미하며 '+'는 십자모양 'o'는 동그라미 모양을 의미한다. 즉, 검은색 십자표시와 검은색 동그라미로 그래프에 나타내겠다는 의미다. 

결과로 다음과 같은 figure가 생성된다.

 

 

 

 

 

[sigmoid.m]

$$g(z) = \frac{1}{1 + e^{-z}}$$

위의 sigmoid function을 반환하는 코드를 작성하는 과제이다.

간단한 코드이며, 아래와 같이 작성할 수 있다.

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(-z));
 
 
 
% =============================================================
 
end

주의해야할 점은 1 + exp(-z)를 나눌 때, element끼리 나누어질 수 있도록 './'로 나누어 주는 것이다.

 

 

[costFunction.m]

Logistic Regression의 Cost Function 값을 반환하는 코드 작성 과제이다.

Hypothesis Function은 아래와 같이 나타낼 수 있다.

$$h_\theta(x) = g(\theta^TX)\text{, } g(z) = \frac{1}{1+ e^-{z}}$$

여기서, 

$$ X = \begin{bmatrix} x_0 = 1 \\ x_1 \\ ... \\ x_n \end{bmatrix} \text{, } \theta = \begin{bmatrix} \theta_0 \\ \theta_1 \\ ... \\ \theta_n \end{bmatrix} \rightarrow \theta^T = \begin{bmatrix} \theta_0 && \theta_1 && ... && \theta_n \end{bmatrix}$$

이다.

 

하지만, Ex2에서 다루는 X는

\(X = \begin{bmatrix} x_1^{(0)} && x_1^{(1)} && ... && x_1^{(n)} \\ ... && ... && ... && ... \\ x_m^{(0)} && x_m^{(1)} && ... && x_m^{(n)} \end{bmatrix}\)

로 표현되기 때문에, 

우리는 Hypothesis Function을 벡터화해서 표현하면 다음과 같이 표현할 수 있다.

\(h_\theta(x) = g(X\theta)\)

 

Logistic Regression의 Cost Function은 linear regression과는 다르며, 아래와 같다.

\(J(\theta) = \frac{1}{m}\sum_{i = 1}^{m}Cost(h_\theta(x^{(i)}, y^{(i)})\) 이며,

여기서

 

\(Cost(h_\theta(x^{(i)}, y^{(i)}) = \left \{ \begin{matrix} -ylog(h_\theta(x)) \text{    if  } y == 1 \\ -(1-y)log(1 - h_\theta(x)) \text{    if  } y == 0 \end{matrix} \right.\)

이다.

위 두 식이 y = 0, 1일 때 각각 유효하므로, 하나로 합쳐서 표현할 수 있고, 최종적으로 Cost Function은 아래의 식과 같다.

$$J(\theta) = -\frac{1}{m}\left [ \sum_{i = 1}^{m}y^{(i)}log(h_\theta(x^{(i)})) + (1 - y^{(i)})log(1 - h_\theta(x^{(i)})) \right ]$$

그리고, Cost Function을 미분하면 아래와 같다.

$$\frac{\partial}{\partial\theta_j}J(\theta) = -\frac{1}{m}\sum_{i = 1}^{m}(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)}$$

 

위 식을 코드로 작성하면 이렇게 작성할 수 있다.

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)));
J = (-1/m)*(y'*log(sigmoid(X*theta)) + (1-y)'*log(1-sigmoid(X*theta)));
h_theta = sigmoid(X*theta);
error = h_theta - y;
grad = (1/m)*(X'*error);
 
% =============================================================
 
end

여기서 J를 구하는 코드를 두 가지로 구현해보았는데, line 23과 line 24 부분이다.

y가 m x 1 행렬이고, X*theta도 m x 1 행렬(X가 m x (n+1) 행렬, theta가 (n+1) x 1 행렬)이기 때문에 

line 23은 y(m x 1)과 X*theta(m x 1)의 요소 곱을 행하고 모든 요소를 더해준 것이고,

line 24는 y의 transform(1 x m)을 X*theta과 곱한 결과로 구현했다. 

두 코드 모두 결과는 동일하다. 

J의 편미분 항을 구할 때, error(line 26)은 \(h_\theta(x^{(i)}) - y^{(i)}\) 부분이고, 최종 미분항은 line 27과 같이 구현할 수 있다.

 

ex2를 실행해보면, 아래와 같이 기대값과 동일하게 결과가 나온 것을 확인할 수 있다.

 

 

 

 

 

[predict.m]

앞서 구현한, costFunction을 사용하여 구한 theta를 Hypothesis Function에 대입해서 결과값을 추측하는 코드를 구현하면 된다. Binary Logistic Regression이고, 우리는 결과값 y가 0 또는 1이라는 것을 알고 있다. 즉, 우리가 구한 Hypothesis Function의 값이 0.5 이상이면 결과값은 1, 0.5 미만이면 0으로 출력하는 예측함수를 작성하면 된다.

round 함수를 사용하여서 반올림해준다.

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

 

 

[costFunctionReg.m]

Regularized Logistic Regression의 Cost Function을 구현하는 과제이다.

정규화된 Logistic Regression의 Cost Function J는 아래와 같다.

$$J(\theta) = -\frac{1}{m} \left [ \sum_{i = 1}^{m}y^{(i)}log(h_\theta(x^{(i)})) + (1 - y^{(i)})log(1 - h_\theta(x^{(i)})) + \lambda\sum_{j = 1}{n}\theta_j^2 \right ]$$

그리고 Cost Function을 편미분한 것은 아래와 같다.

\(\frac{\partial}{\partial\theta_0}J(\theta) = \frac{1}{m} \left [ \sum_{i = 1}{m}(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} \right ]\)

\(\frac{\partial}{\partial\theta_j}J(\theta) = \frac{1}{m} \left [ \sum_{i = 1}{m}(h_\theta(x^{(i)}) - y^{(i)})x_j^{(i)} + \lambda\theta_j \right] \text{  (j = 1, 2, ..., n)}\)

그리고 위 식을 벡터화해서 나타내면 아래와 같이 나타낼 수 있다.

\(J(\theta) = -\frac{1}{m} (y^Tlog(g(X\theta)) + (1 - y)^Tlog(1 - g(X\theta))) + \frac{\lambda}{2m}\theta^T\theta \)

\(\frac{\partial}{\partial\theta_j}J(\theta) = \frac{1}{m}X^T(g(X\theta) - y)\)

아래는 과제에 대한 코드이다.

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;
 
% comput J without Regularization
J = (-1/m) * sum(y.*log(sigmoid(X*theta))+(1-y).*log(1-sigmoid(X*theta)));
% comput J with Regularization
J = J + ((lambda)/(2*m))*(sum(tempTheta.^2));
 
temp = sigmoid(X*theta);
error = temp - y;
grad = (1/m) * (X' * error) +(lambda/m)*tempTheta;
 
% =============================================================
 
end

위에서 정규화된 Cost  Function의 식은 아래와 같이 한 번에 작성해도 된다.

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

 

댓글