email

Octave Notes

date_range
query_builder2 minute read

This is a work in progress / running list of notes on recipes for working with Octave.

Octave Docs

Plotting Multiple Lines in a Loop

This was a compact way to create a quick graph of muliple lines of data with one call to plot. In this example, I loop through a range of learning rates in a gradient descent algorithm and then plot the change in cost against the number of iterations.

For each learning rate iteration, the series of cost changes is stored in a matrix. Then when all the iterations are complete, you just call plot on the entire matrix.

A nice trick on line 13 is using the same range of values that were looped through to create the series as the input for a legend. There may be an easier way to do this, but the legend function accepts a cell array of strings as an argument, not an array of numbers. You can convert the numerical array to a cell array with num2cell and then use cellfun to convert the numbers to strings.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
% Run Gradient Descent for range of alphas
alpha_range = [0.3, 0.1, 0.03, 0.01];
J_history_range = zeros(num_iters,length(alpha_range));
for a=1:length(alpha_range),
  [theta_r, J_history_range(:,a)] = gradientDescentMulti(X, y, theta, alpha_range(a), num_iters);
end
  
% Plot the convergence graph
figure;
plot(1:num_iters, J_history_range, 'LineWidth', 2);
xlabel('Number of iterations');
ylabel('Cost J');
legend(cellfun(@num2str, num2cell(alpha_range), "UniformOutput", false))