How to plot decision boundary for logistic regression in MATLAB?

88 次查看(过去 30 天)
I am trying to run logistic regression on a small data set. I present the full code below:
%% Plotting data
x1 = linspace(0,3,50);
mqtrue = 5;
cqtrue = 30;
dat1 = mqtrue*x1+5*randn(1,50);
x2 = linspace(7,10,50);
dat2 = mqtrue*x2 + (cqtrue + 5*randn(1,50));
x = [x1 x2]'; % X
subplot(2,2,1);
dat = [dat1 dat2]'; % Y
scatter(x1, dat1); hold on;
scatter(x2, dat2, '*'); hold on;
classdata = (dat>40);
%% Compute Cost and Gradient
% Setup the data matrix appropriately, and add ones for the intercept term
[m, n] = size(x);
% Add intercept term to x and X_test
x = [ones(m, 1) x];
% Initialize fitting parameters
initial_theta = zeros(n + 1, 1);
% Compute and display initial cost and gradient
[cost, grad] = logistic_costFunction(initial_theta, x, dat);
% Plot Boundary
plotDecisionBoundary(initial_theta, x, dat);
%% Predict and Accuracies
% Compute accuracy on our training set
p = predict(initial_theta, x);
fprintf('Train Accuracy: %f\n', mean(double(p == dat)) * 100);
000.png
I then proceed to compute gradient and cost:
logistic_costFunction.m
-----------------------
function [J, grad] = logistic_costFunction(theta, X, y)
% Initialize some useful values
m = length(y); % number of training examples
grad = zeros(size(theta));
H = sigmoid(X*theta);
T = y.*log(H) + (1 - y).*log(1 - H);
J = -1/m*sum(T);
% ====================Compute grad==================
for i = 1 : m
grad = grad + (H(i) - y(i)) * X(i,:)';
end
grad = 1/m*grad;
end
sigmoid.m
function g = sigmoid(z)
% Computes thes sigmoid of z
g = zeros(size(z));
g = 1 ./ (1 + (1 ./ exp(z)));
end
plotDecisionBoundary.m
----------------------
function plotDecisionBoundary(theta, X, y)
%PLOTDECISIONBOUNDARY Plots the data points X and y into a new figure with
%the decision boundary defined by theta
if size(X, 2) <= 3
% Only need 2 points to define a line, so choose two endpoints
plot_x = [min(X(:,2))-2, max(X(:,2))+2];
% Calculate the decision boundary line
plot_y = (theta(2).*plot_x + theta(1));
% Plot, and adjust axes for better viewing
plot(plot_x, plot_y)
% Legend, specific for the exercise
legend('Admitted', 'Not admitted', 'Decision Boundary')
axis([30, 100, 30, 100])
else
% Here is the grid range
u = linspace(-1, 1.5, 50);
v = linspace(-1, 1.5, 50);
z = zeros(length(u), length(v));
% Evaluate z = theta*x over the grid
for i = 1:length(u)
for j = 1:length(v)
z(i,j) = mapFeature(u(i), v(j))*theta;
end
end
z = z'; % important to transpose z before calling contour
% Plot z = 0
% Notice you need to specify the range [0, 0]
contour(u, v, z, [0, 0], 'LineWidth', 2)
end
hold off
end
I get no errors, even though I haven't verified if the logistic regression is actually working. I then proceed to plot and predict accuracy.
predict.m
---------
function p = predict(theta, X)
% 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)
p = (sigmoid(X*theta) >= 0.5);
end
After running the main script I get an empty plot:
00.png
Workspace:
0.png
Any suggestions on how I can plot the decision boundary line correctly?

回答(2 个)

An Liu
An Liu 2020-1-16
maybe your axis is not fit your data
you need to change the axis range in plotDecisionBoundery function
function plotDecisionBoundary(theta, X, y)
...
% Legend, specific for the exercise
legend('Admitted', 'Not admitted', 'Decision Boundary')
axis([30, 100, 30, 100])->change here
...
end
  2 个评论
Suresh Subbanarahari
An liu, thanks for your reply. I had similar issue and could adjust to see the values. Any suggestion to check on why it always shows a straight line which is not an expected decision boundary.
Samet Oran
Samet Oran 2020-8-31
because your code needs to arrange "cost function" The cost value that 0.6931 the first iteration result. It needs to reduce. The link will help you;

请先登录,再进行评论。


waleed qaisrani
waleed qaisrani 2020-11-5
Chage your "plot_y" in your "Plot Decision Boundary" Function
From this:
plot_y = (theta(2).*plot_x + theta(1));
To this:
plot_y = (-1./theta(3)).*(theta(2).*plot_x + theta(1));

类别

Help CenterFile Exchange 中查找有关 Linear and Nonlinear Regression 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by