Constrained Polynomial Regression
Mostrar comentarios más antiguos
Hey all,
I'm sure someone will have a quick answer for my probably dumb question. Performing polynomial least squares regression of a set of [x,y] data. Using polyfit, polyval, and corrcoef, I solved for the standard regression.
My problem is when I need to solve for a constrained polynomial such as: f(x)=a3*x.^3+a1*x+a0
So what am I missing that leaves me with no understanding how to solve this problem.
1 comentario
Michael Nemesure
el 15 de Mzo. de 2017
One way to achieve a polynomial fit with some coefficients constrained is to use the psedo-inverse pinv on an appropriately modified Vandermonde matrix. An example: for a 4th order fit to n data points (x,y) with linear and quadratic coefficents fixed at p1 and p2, compute
pinv([ones(n,1) zeros(n,1) zeros(n,1) X.^3 X.^4])* (Y - p1*X - p2*X.^2)
The resulting column vector will have 0's in the constrained locations to be replaced by p1 and p2.
Respuesta aceptada
Más respuestas (6)
Richard Willey
el 6 de Mzo. de 2012
1 voto
Curve Fitting Toolbox allows you to specify constraints for individual regression coefficients.
With this said and done, could you please elaborate why you need to constrain a regression coefficient to be precisely equal to zero rather than simply leaving that term out of your model?
Mark Selby
el 6 de Mzo. de 2012
The simple first principles way is as follows...
x=(1:10)'; % invent some data for prediction
y = x.^3 + 2; % and generate some "experimental" data
% create a matrix that contains all you predictors
% note just include the terms you want
vm=[x.^3 ones(size(x))]; % the vandermode matrix
% then solve the least squares problem.
beta = vm\y %this is essentially what polyfit does.
Alternatively download "polyfitn" from the FEX.... it does what it says on the tin AND your problem with a nice interface and some help.
4 comentarios
Jared
el 6 de Mzo. de 2012
Sean de Wolski
el 6 de Mzo. de 2012
http://en.wikipedia.org/wiki/Vandermonde_matrix
You create a vandermonde matrix for your above expression (y = a3.*x^3+a1*x-200) such that v, contains the xpressions to solve for) and v*x=y;
V = [x(:).^3, x(:), ones(size(x(:)))]
Jared
el 6 de Mzo. de 2012
Sean de Wolski
el 6 de Mzo. de 2012
Totally okay. And this question has yielded lots of good edumacational information, so +1.
Jared
el 6 de Mzo. de 2012
0 votos
Richard Willey
el 6 de Mzo. de 2012
The 12a release of Statistics Toolbox has some very nice new features for regression analysis. There is a new function named LinearModel for linear regression. The function implements a scripting syntax called "Wilkinson's Notation" which is designed for implementing custom linear models. (Wilkinson's Notation" is pretty standard amongst statisticians)
% Create a data set
X = linspace(1, 10, 100);
X = X';
Y = 3*X.^3 + 5*X + 7;
% Fit a linear regression to the model
myFit = LinearModel.fit(X,Y, 'y~x1:x1:x1 + x1')
plot(myFit)
methods(myFit)
The text string 'y~x1:x1:x1 + x1' translates as y is modeled as function of X^3, X, and a constant. The model excludes the term X^2 which is equivalent to setting the coefficient equal to zero.
Roland
el 3 de Jul. de 2019
0 votos
For others looking into polynomial regression with constraints:
A general framework for constraint polynomial approximation (value constraints, derivative constraints, coefficient constraints) can be found in a paper of me and my colleagues:
- O’Leary, P., Ritt, R. and Harker, M. (2019) ‘Constrained Polynomial Approximation for Inverse Problems in Engineering’, in Wahab, M. A. (ed.) Proceedings of the 1st International Conference on Numerical Modelling in Engineering. Springer Singapore, pp. 225–244. doi: 10.1007/978-981-13-2273-0_19.
Kin Sung Chan
el 30 de Sept. de 2019
0 votos
One way is to use the fittype and fix the lower and upper bound. (x,y) are some vectors that you want to fit.
The good thing about this method is you can fit with whatever equation you like.
s = fitoptions('Method','NonlinearLeastSquares',...
'Lower',[10 -10 ],...
'Upper',[10 10 ],...
'MaxIter',10000,...
'TolX',1E-8,...
'Startpoint',[10,0]);
f = fittype('a1*x+b','options',s);
ffit = fit(x, y, f)
Categorías
Más información sobre Linear and Nonlinear Regression en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!