149 lines
5.8 KiB
Matlab
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
|