How to apply PSO FOR REGRESSION?.
1 view (last 30 days)
Show older comments
If i have number of predictors and output in excel sheet file. Can i apply PSO for prediction of output?.
Can anyone help me to implement it?.
Thanks in advance
0 Comments
Accepted Answer
Sam Chak
on 30 Oct 2023
it is technically possible to use PSO for predicting the output, although not by directly applying PSO. The regression problem can be formulated as a least-squares problem, and an objective function can be constructed from it, which can then be minimized using PSO. Here is an example, but please note that it can be somewhat tedious, as MATLAB's particleswarm() is designed for single-objective optimization.
%% Data
x = 0:5; % input vector
y = [2.1 7.7 13.6 27.2 40.9 61.1]; % output vector
%% Data processing
n = length(x);
Sx = sum(x);
Sx2 = sum(x.^2);
Sx3 = sum(x.^3);
Sx4 = sum(x.^4);
Sy = sum(y);
Sxy = sum(x.*y);
Sx2y = sum((x.^2).*y);
%% Least-square Regression model: lsy(x) = p1·x² + p2·x + p3;
% Sx2*p1 + Sx*p2 + n*p3 = Sy ... Eq.(1)
% Sx3*p1 + Sx2*p2 + Sx*p3 = Sxy ... Eq.(2)
% Sx4*p1 + Sx3*p2 + Sx2*p3 = Sx2y ... Eq.(3)
% p3 = (Sy - (Sx2*p1 + Sx*p2))/n ... from Eq.(1)
% Sx3*p1 + Sx2*p2 + Sx*((Sy - (Sx2*p1 + Sx*p2))/n) = Sxy ... Eq.(4)
% Sx4*p1 + Sx3*p2 + Sx2*((Sy - (Sx2*p1 + Sx*p2))/n) = Sx2y ... Eq.(5)
% p2 = (Sxy - Sx*Sy/n - Sx3*p1 + Sx*Sx2/n*p1)/(Sx2 - Sx*Sx/n) ... from Eq.(4)
% Sx4*p1 + Sx3*((Sxy - Sx*Sy/n - Sx3*p1 + Sx*Sx2/n*p1)/(Sx2 - Sx*Sx/n)) + Sx2*((Sy - (Sx2*p1 + Sx*((Sxy - Sx*Sy/n - Sx3*p1 + Sx*Sx2/n*p1)/(Sx2 - Sx*Sx/n))))/n) - Sx2y = 0 ... Eq.(6)
%% Make Eq.(6) a convex function so that PSO can be used
fun = @(p1) (Sx4*p1 + Sx3*((Sxy - Sx*Sy/n - Sx3*p1 + Sx*Sx2/n*p1)/(Sx2 - Sx*Sx/n)) + Sx2*((Sy - (Sx2*p1 + Sx*((Sxy - Sx*Sy/n - Sx3*p1 + Sx*Sx2/n*p1)/(Sx2 - Sx*Sx/n))))/n) - Sx2y).^2;
nvar = 1;
p1 = particleswarm(fun, nvar)
p2 = (Sxy - Sx*Sy/n - Sx3*p1 + Sx*Sx2/n*p1)/(Sx2 - Sx*Sx/n)
p3 = (Sy - (Sx2*p1 + Sx*p2))/n
%% Find the coefficient of determination, R²
xbar = mean(x);
ybar = mean(y);
dev = y - ybar;
Sdev = sum(dev.^2);
lsy = @(x) p1*x.^2 + p2*x + p3;
err = y - lsy(x);
Serr = sum(err.^2);
Rsq = (Sdev - Serr)/Sdev % R-square
%% Plot result
xx = 0:0.01:5;
plot(x, y, 'o', 'markersize', 12, 'linewidth', 2), hold on
plot(xx, lsy(xx)), grid on
xlabel('x'), ylabel('y')
title('Polynomial Regression using PSO')
0 Comments
More Answers (0)
See Also
Categories
Find more on Linear and Nonlinear Regression in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!