How to do piecewise linear approximation from x and y points?

69 ビュー (過去 30 日間)
Md. Nazrul Islam Siddique
Md. Nazrul Islam Siddique 2022 年 11 月 23 日
回答済み: Image Analyst 2022 年 11 月 23 日
I have x and y points as follows:
x = [20 60 240 480 1440 2880];
y = [0.0278 0.1626 1.8126 4.006 18.2491 44.4084]
I am trying to do the piecewise linear approximation to get the equation of the line. How can I proceed? I have used polyfit function and got the slope and interception for the line. However, I am not sure if it is correct or not? For example, if value of x is < 60, I am getting a negative value of y from the defined fuction from polyfit.

採用された回答

John D'Errico
John D'Errico 2022 年 11 月 23 日
編集済み: John D'Errico 2022 年 11 月 23 日
x = [20 60 240 480 1440 2880];
y = [0.0278 0.1626 1.8126 4.006 18.2491 44.4084];
plot(x,y,'o-')
You have only 6 data points. Hoping for any reasonable piecewise linear approximation to this is wildly wishing on a star.
The polynomial (straight line) fit will of course produuce a negative y-intercept on that daya.
polyfit(x,y,1)
ans = 1×2
0.0156 -1.8417
So at x == zero, it would predict -1.8417.
But that just means a straight line model may have some lack of fit. Since the data does have some curvature, a linear fit will not make sense. Even a quadratic fit fails to predict a positive value at x==0.
format long g
polyfit(x,y,2)
ans = 1×3
1.98278909699252e-06 0.0099272840717487 -0.549621036882257
You don't really have enough data to have much predictive value here. But I will point out that the positive curvature of your data will make ANY linear fit have a a negative y intercept at x == 0.
What you MIGHT do is fit a quadratic polynomial, without a constant term. So a model of the form
y = a1*x^2 + a2*x
Clearly, when x == 0, this model will always pass exactly through zero. And it will have positive curvature to fit your limited data.
% I can use backslash to estimate the model, but perhaps the curve fitting
% toolbox may be a better idea, as it is easier to use.
% P2 = [x'.^2, x']\y'; % this would fit a quadratic model, with no constant term
mdl2 = fittype('a2*x.^2 + a1*x','indep','x')
mdl2 =
General model: mdl2(a1,a2,x) = a2*x.^2 + a1*x
P2 = fit(x',y',mdl2)
Warning: Start point not provided, choosing random start point.
P2 =
General model: P2(x) = a2*x.^2 + a1*x Coefficients (with 95% confidence bounds): a1 = 0.008991 (0.006946, 0.01104) a2 = 2.248e-06 (1.468e-06, 3.029e-06)
xpred = linspace(min(x),max(x));
ypred2 = P2(xpred);
plot(x,y,'bo',xpred,ypred2,'-r')
I don't know how much noise is in your data. But another idea is to try a cubic model, that again has no constant term.
mdl3 = fittype('a3*x.^3 + a2*x.^2 + a1*x','indep','x')
mdl3 =
General model: mdl3(a1,a2,a3,x) = a3*x.^3 + a2*x.^2 + a1*x
P3 = fit(x',y',mdl3)
Warning: Start point not provided, choosing random start point.
P3 =
General model: P3(x) = a3*x.^3 + a2*x.^2 + a1*x Coefficients (with 95% confidence bounds): a1 = 0.005566 (0.004167, 0.006964) a2 = 6.449e-06 (4.854e-06, 8.043e-06) a3 = -1.051e-09 (-1.447e-09, -6.555e-10)
ypred3 = P3(xpred);
plot(x,y,'bo',xpred,ypred3,'-r')
I don't think your data even justifies that curve fit, but it does seem to fit your data.

その他の回答 (2 件)

Walter Roberson
Walter Roberson 2022 年 11 月 23 日
編集済み: Walter Roberson 2022 年 11 月 23 日
A piecewise linear approximation could have a piecewise break at or between any pair of points, and is therefore not unique. You would have to constrain the approximation to have a hope.
For example you could require a break exactly half-way between two points if the previous segment was length 2 or more and the projected estimate at the additional point would be more than 10% different than the point.
(Notice that this rule has potential problem, such as what to do if that would leave an isolated point; notice too that because it depends upon value of the point, the effect of the difference depends on how close to the axes you are. A difference of 10 might be immaterial if the y coordinate were a million -- but on the other hand if you translated the coordinates down by a million and had the same relative values near the axes, is a difference of 10 suddenly relevant?)

Image Analyst
Image Analyst 2022 年 11 月 23 日
I really see no point in fitting two lines to data where there is only 6 points. With so few points there is essentially no confidence that the lines will be much like what they would be if you had hundreds of points. So why bother? What are you going to do with this information?
Nonetheless, you can try my piecewise fitting demo, attached.

カテゴリ

Help Center および File ExchangeGet Started with Curve Fitting Toolbox についてさらに検索

製品


リリース

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by