94 lines
2.8 KiB
Matlab
94 lines
2.8 KiB
Matlab
%% 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'); |