FuzzySystems/Work 3/source/plot_results1.m

149 lines
5.8 KiB
Matlab

function plot_results1(init_fis, final_fis, trn_error, val_error, y_true, y_pred, model_id)
%PLOT_RESULTS
% Creates and saves:
% (A) One consolidated figure for membership functions (all inputs):
% - 2 x Ninputs tiled layout
% - Top row: BEFORE training (all MFs per input in one subplot)
% - Bottom row: AFTER training (all MFs per input in one subplot)
% (B) Learning curves (train & validation)
% (C) Predicted vs Actual (with y=x reference)
% (D) Prediction Error (time series + MAE)
%
% All figures are saved to ./figures as both PDF and PNG.
%
% Usage:
% plot_results(init_fis, final_fis, trn_error, val_error, y_true, y_pred, model_id)
% Input checks
if nargin < 7
error('plot_results: not enough inputs. Expected 7 arguments.');
end
if numel(y_true) ~= numel(y_pred)
error('plot_results: y_true and y_pred must have the same length.');
end
y_true = y_true(:);
y_pred = y_pred(:);
% Output directory
outdir = fullfile('.', 'figures_scn1');
if ~exist(outdir, 'dir'); mkdir(outdir); end
% (A) MEMBERSHIP FUNCTIONS — ONE FIGURE, 2 x Ninputs (BEFORE / AFTER)
% =====================================================================
nInputs = numel(init_fis.Inputs);
% Precompute x/y for all inputs to keep consistent axes
Xb = cell(1, nInputs); Yb = cell(1, nInputs); % BEFORE
Xa = cell(1, nInputs); Ya = cell(1, nInputs); % AFTER
nMFb = zeros(1, nInputs); nMFa = zeros(1, nInputs);
for inIdx = 1:nInputs
[xb, yb] = plotmf(init_fis, 'input', inIdx);
[xa, ya] = plotmf(final_fis, 'input', inIdx);
Xb{inIdx} = xb; Yb{inIdx} = yb; nMFb(inIdx) = size(yb,2);
Xa{inIdx} = xa; Ya{inIdx} = ya; nMFa(inIdx) = size(ya,2);
end
% Create consolidated figure
f = figure('Name', sprintf('MFs — Model %d', model_id), 'Color','w');
tl = tiledlayout(f, 2, nInputs, 'TileSpacing','compact', 'Padding','compact');
% Titles for rows
rowTitles = {'BEFORE training', 'AFTER training'};
for inIdx = 1:nInputs
% BEFORE (top row)
nexttile(tl, inIdx); % row 1, col inIdx
hold on; grid on;
xb = Xb{inIdx}; yb = Yb{inIdx}; kB = size(yb,2);
for k = 1:kB
plot(xb, yb(:,k), 'LineWidth', 1.5);
end
xlabel(sprintf('Input x%d', inIdx), 'Interpreter','latex');
ylabel('Membership', 'Interpreter','latex');
title(sprintf('%s — x%d', rowTitles{1}, inIdx), 'Interpreter','latex');
% Optional legend only on the first tile to reduce clutter
if inIdx == 1
lgdB = arrayfun(@(k) sprintf('MF %d', k), 1:kB, 'UniformOutput', false);
legend(lgdB, 'Location','best');
end
% AFTER (bottom row)
nexttile(tl, nInputs + inIdx); % row 2, col inIdx
hold on; grid on;
xa = Xa{inIdx}; ya = Ya{inIdx}; kA = size(ya,2);
for k = 1:kA
plot(xa, ya(:,k), 'LineWidth', 1.5);
end
xlabel(sprintf('Input x%d', inIdx), 'Interpreter','latex');
ylabel('Membership', 'Interpreter','latex');
title(sprintf('%s — x%d', rowTitles{2}, inIdx), 'Interpreter','latex');
if inIdx == 1
lgdA = arrayfun(@(k) sprintf('MF %d', k), 1:kA, 'UniformOutput', false);
legend(lgdA, 'Location','best');
end
end
% Super-title
sgtitle(tl, sprintf('Membership Functions — Model %d', model_id), 'Interpreter','latex');
% Save consolidated MF figure
save_figure(f, fullfile(outdir, sprintf('model_%d_mfs_all_inputs', model_id)));
% (B) LEARNING CURVES (train & validation)
% ============================================
f = figure('Name', sprintf('Learning Curves - Model %d', model_id), 'Color','w');
plot(trn_error, 'LineWidth', 1.5); hold on; grid on;
if ~isempty(val_error)
plot(val_error, 'LineWidth', 1.5);
legend('Train','Validation','Location','best');
else
legend('Train','Location','best');
end
xlabel('Epoch', 'Interpreter','latex');
ylabel('Error', 'Interpreter','latex');
title(sprintf('Learning Curves | Model %d', model_id), 'Interpreter','latex');
save_figure(f, fullfile(outdir, sprintf('model_%d_learning_curves', model_id)));
% (C) PREDICTED vs ACTUAL
% ============================================
f = figure('Name', sprintf('Predicted vs Actual - Model %d', model_id), 'Color','w');
plot(y_true, y_pred, '.', 'MarkerSize', 10); hold on; grid on;
mins = min([y_true; y_pred]);
maxs = max([y_true; y_pred]);
plot([mins maxs], [mins maxs], 'k-', 'LineWidth', 1);
xlabel('Actual', 'Interpreter','latex');
ylabel('Predicted', 'Interpreter','latex');
title(sprintf('Predicted vs Actual | Model %d', model_id), 'Interpreter','latex');
save_figure(f, fullfile(outdir, sprintf('model_%d_pred_vs_actual', model_id)));
% (D) PREDICTION ERROR
% ============================================
err = y_true - y_pred;
f = figure('Name', sprintf('Prediction Error - Model %d', model_id), 'Color','w');
plot(err, 'k'); grid on;
xlabel('Iteration', 'Interpreter','latex');
ylabel('Prediction Error', 'Interpreter','latex');
title('Prediction Error', 'Interpreter','latex');
mae = mean(abs(err));
try
subtitle(sprintf('Mean absolute error: %f', mae), 'Interpreter','latex');
catch
title(sprintf('Prediction Error (MAE=%.6f)', mae), 'Interpreter','latex');
end
save_figure(f, fullfile(outdir, sprintf('model_%d_error', model_id)));
end
% Helper: consistent saving (PDF + PNG, landscape)
function save_figure(fig_handle, basepath)
set(fig_handle, 'PaperUnits','normalized');
set(fig_handle, 'PaperPosition', [0 0 1 1]);
set(fig_handle, 'PaperOrientation', 'landscape');
% print(fig_handle, '-dpdf', [basepath '.pdf']);
print(fig_handle, '-dpng', [basepath '.png']);
end