FuzzySystems/Work 3/source/scenario1.m

94 lines
2.8 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

%% Scenario1 (TSK - Airfoil Self-Noise)
%
% Assignment 3 in Fuzzy systems
%
% author:
% Christos Choutouridis ΑΕΜ 8997
% cchoutou@ece.auth.gr
%
clear; clc; close all;
% Configuration
% --------------------------------
config.mf_types = ["constant", "constant", "linear", "linear"];
config.num_mf = [2, 3, 2, 3]; % #MFs per input
config.model_names = ["TSK0-2MF", "TSK0-3MF", "TSK1-2MF", "TSK1-3MF"];
config.Nepochs = 100;
rng(42,'twister');
% Load dataset (Airfoil Self-Noise: 5 inputs, 1 target)
data = load("Datasets/airfoil_self_noise.dat");
% Split data: 60% train, 20% val, 20% check(test)
[X_trn, y_trn, X_val, y_val, X_chk, y_chk] = split_data(data, [0.6 0.2 0.2], 42);
% Preprocess inputs (mode=1 -> MinMax to [0,1])
[X_trn, X_val, X_chk, stats] = preprocess_data(X_trn, X_val, X_chk, 1);
% Pack data for anfis/evalfis convenience
trn_data = [X_trn, y_trn];
val_data = [X_val, y_val];
chk_X = X_chk;
chk_y = y_chk;
% Results
T = table(['MSE '; 'RMSE'; 'R2 '; 'NMSE'; 'NDEI'], 'VariableNames', {'Metrics'});
all_models = cell(1,4);
all_trnErr = cell(1,4);
all_valErr = cell(1,4);
for i = 1:length(config.mf_types)
fprintf('\n');
fprintf('Model %d: %s (gbellmf × %d per input)\n', i, config.model_names(i), config.num_mf(i));
fprintf('=====================================\n');
% Step 1 - Initial FIS via Grid Partition
opt_g = genfisOptions("GridPartition", ...
"InputMembershipFunctionType", "gbellmf", ...
"NumMembershipFunctions", config.num_mf(i), ...
"OutputMembershipFunctionType", config.mf_types(i));
init_fis = genfis(X_trn, y_trn, opt_g);
% Info rules and MF
nRules = numel(init_fis.Rules);
fprintf('Initial rules: %d\n', nRules);
% Step 2 - Train with ANFIS (Hybrid: BP + LSE)
opt_a = anfisOptions( ...
"InitialFis", init_fis, ...
"ValidationData", val_data, ...
"EpochNumber", config.Nepochs, ...
"OptimizationMethod", 1 ... % 1=Hybrid
);
[trn_fis, trn_error, ~, val_fis, val_error] = anfis(trn_data, opt_a);
final_fis = val_fis; % Select final
% Step 3 - Evaluate on Check/Test set
y_hat = evalfis(final_fis, chk_X);
[mse, rmse, r2, nmse, ndei] = evaluate(y_hat, chk_y);
% Print & store metrics
fprintf('MSE : %g\n', mse);
fprintf('RMSE: %g\n', rmse);
fprintf('R2 : %g\n', r2);
fprintf('NMSE: %g\n', nmse);
fprintf('NDEI: %g\n', ndei);
T = addvars(T, [mse; rmse; r2; nmse; ndei], 'NewVariableNames', sprintf('Model_%d',i));
% Plots & figure exports
% - MFs before/after
% - Learning curves
% - Predicted vs Actual
% - Prediction Error
plot_results1(init_fis, final_fis, trn_error, val_error, y_chk, y_hat, i);
end
% Show and save table
disp(T);
writetable(T, 'scenario1_metrics.csv');