Clear Filters
Clear Filters

how to write objective function

37 views (last 30 days)
ali
ali on 28 May 2024
Commented: ali on 20 Aug 2024 at 6:43
i want to pso algorithm on svr model ,as far as i know i need to write objective function in first code and determine other parameter to rest.
i got the objective function svr but i don't know how to write that i used it in my pso algorithm then i found optimaziton of costfunction and penalty factor and insensitive loss

Answers (1)

Arnav
Arnav on 20 Aug 2024 at 6:15
Hi @ali,
The general workflow for training a SVR model using PSO optimization is as follows:
The parameters we need to find are the hyperparameters of the SVR Model.
This is done by training the SVR model and finding the loss from the predictions made on the validation set using the swarm hyperparameters. I have used Root Mean Squared Error as this is a regression task. These hyperparameters will be updated according to the PSO algorithm. To clarify, we are not training the SVR using PSO (we do not need to consider the objective function of the SVR). We are using PSO to find optimal hyperparameters for the SVR Model.
This can be done as follows:
load carsmall
% Use Horsepower and Weight as features, MPG as the target variable
X = [Horsepower, Weight];
y = MPG;
% Remove any rows with NaN values
validIdx = ~any(isnan(X), 2) & ~isnan(y);
X = X(validIdx, :);
y = y(validIdx);
% Split the data into training and validation sets
cv = cvpartition(length(y), 'HoldOut', 0.3);
X_train = X(training(cv), :);
y_train = y(training(cv));
X_val = X(test(cv), :);
y_val = y(test(cv));
% Define the objective function using RMSE
function rmse = svrObjective(params, X_train, y_train, X_val, y_val)
C = params(1);
epsilon = params(2);
kernelScale = params(3);
% Train SVR model with RBF kernel
svrModel = fitrsvm(X_train, y_train, 'KernelFunction', 'rbf', ...
'BoxConstraint', C, 'Epsilon', epsilon, 'KernelScale', kernelScale);
% Predict on validation set
predictions = predict(svrModel, X_val);
% Calculate root mean squared error
rmse = sqrt(mean((y_val - predictions).^2));
end
% PSO optimization using particleswarm with reasonable bounds
nvars = 3; % Number of variables: C, epsilon, kernelScale
lb = [0.1, 0.001, 0.1]; % Lower bounds for C, epsilon, kernelScale
ub = [10000, 2, 10000]; % Upper bounds for C, epsilon, kernelScale
% Define the objective function handle
objectiveFunction = @(params) svrObjective(params, X_train, y_train, X_val, y_val);
% Set optimization options
options = optimoptions('particleswarm', ...
'SwarmSize', 200, ...
'Display', 'iter');
% Run PSO
rng(42)
[bestParams, bestRMSE] = particleswarm(objectiveFunction, nvars, lb, ub, options);
Best Mean Stall Iteration f-count f(x) f(x) Iterations 0 200 3.393 3.84 0 1 400 3.369 3.828 0 2 600 3.369 4.585 1 3 800 3.367 4.925 0 4 1000 3.367 4.822 1 5 1200 3.364 4.4 0 6 1400 3.36 4.512 0 7 1600 3.36 4.84 1 8 1800 3.36 4.822 2 9 2000 3.359 4.468 0 10 2200 3.359 4.681 1 11 2400 3.359 4.846 2 12 2600 3.359 4.763 0 13 2800 3.359 4.817 1 14 3000 3.359 4.722 2 15 3200 3.359 4.881 3 16 3400 3.359 4.683 4 17 3600 3.359 4.276 5 18 3800 3.355 3.949 0 19 4000 3.355 3.546 0 20 4200 3.355 3.56 1 21 4400 3.354 3.499 0 22 4600 3.354 3.527 1 23 4800 3.353 3.374 0 24 5000 3.351 3.431 0 25 5200 3.351 3.407 1 26 5400 3.349 3.44 0 27 5600 3.349 3.367 1 28 5800 3.349 3.421 2 29 6000 3.349 3.383 3 30 6200 3.349 3.365 4 Best Mean Stall Iteration f-count f(x) f(x) Iterations 31 6400 3.349 3.382 5 32 6600 3.349 3.363 6 33 6800 3.349 3.363 7 34 7000 3.349 3.381 8 35 7200 3.349 3.381 9 36 7400 3.349 3.362 10 37 7600 3.349 3.38 11 38 7800 3.349 3.379 12 39 8000 3.349 3.361 13 40 8200 3.349 3.362 0 41 8400 3.349 3.361 1 42 8600 3.349 3.361 2 43 8800 3.349 3.361 0 44 9000 3.349 3.361 1 45 9200 3.348 3.361 0 46 9400 3.348 3.361 1 47 9600 3.348 3.361 2 48 9800 3.348 3.361 0 49 10000 3.348 3.361 1 50 10200 3.348 3.36 2 51 10400 3.348 3.361 0 52 10600 3.348 3.36 1 53 10800 3.348 3.36 2 54 11000 3.348 3.36 3 55 11200 3.348 3.36 4 56 11400 3.348 3.36 5 57 11600 3.348 3.36 6 58 11800 3.348 3.359 7 59 12000 3.348 3.36 8 60 12200 3.348 3.36 9 Best Mean Stall Iteration f-count f(x) f(x) Iterations 61 12400 3.348 3.36 10 62 12600 3.348 3.36 11 63 12800 3.348 3.36 12 64 13000 3.348 3.36 13 65 13200 3.348 3.36 14 66 13400 3.348 3.359 15 67 13600 3.348 3.36 16 68 13800 3.348 3.36 17 69 14000 3.348 3.359 18 70 14200 3.348 3.36 19 Optimization ended: relative change in the objective value over the last OPTIONS.MaxStallIterations iterations is less than OPTIONS.FunctionTolerance.
% Display results
fprintf('Best Parameters: C = %.3f, epsilon = %.3f, kernelScale = %.3f\n', bestParams(1), bestParams(2), bestParams(3));
Best Parameters: C = 618.078, epsilon = 0.001, kernelScale = 2997.984
fprintf('Best RMSE: %.3f\n', bestRMSE);
Best RMSE: 3.348
These parameters can be used to train a SVR Model that minimizes the RMSE.
I have provided a wide range as bounds of the parameters. You may experiment with different bounds, or you may explore other optimization options like SwarmSize, FunctionTolerance, etc.
You can learn more about these options in the documentation page of particleswarm function:
You might also want to look at the documentation page for fitrsvm for other ways to find optimal hyperparameters and have a look at the different hyperparameters:
I hope this helps!

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!