找到最适合数据的行

时间:2017-02-28 15:12:44

标签: matlab octave curve-fitting data-fitting

我试图找到最适合数据的行。我使用下面的代码,但现在我希望将数据放入一个排序的数组中,以便它具有最接近该行的数据,我该如何做?也是polyfit正确的函数用于此?

x=[1,2,2.5,4,5];
y=[1,-1,-.9,-2,1.5];
n=1;
p = polyfit(x,y,n)

f = polyval(p,x);
plot(x,y,'o',x,f,'-')

Image

PS:我使用Octave 4.0,类似于Matlab

3 个答案:

答案 0 :(得分:2)

您可以先计算实际值y与预测值f之间的误差

err = abs(y-f);

然后对错误向量进行排序

[val, idx] = sort(err);

使用已排序的索引将y值排序

y2 = y(idx);

现在y2y具有相同的值,但首先更接近拟合值。

对x进行相同的计算x2,这样你就可以得到x2和y2之间的对应关系

x2 = x(idx);

答案 1 :(得分:1)

Sembei Norimaki在解释你的主要问题时做得很好,所以我会看看你的第二个问题= polyfit是否合适?

最佳拟合线定义为平均误差为零的线。

如果必须是" line"我们可以使用polyfit,它将适合多项式。当然,"线"可以定义为一次多项式,但是一次多项式具有一些易于处理的属性。您正在寻找的一阶多项式(或线性)方程应采用以下形式:

y = mx + b

其中y是您的因变量,X是您的自变量。所以挑战在于:找到m和b使得建模的y尽可能接近实际y。事实证明,与线性拟合相关的误差是凸的,这意味着它具有一个最小值。为了计算这个最小值,最简单的方法是将偏差和x向量组合如下:

Xcombined = [x.' ones(length(x),1)];

然后利用从误差最小化导出的正规方程

beta = inv(Xcombined.'*Xcombined)*(Xcombined.')*(y.')

很好,现在我们的行被定义为Y = Xcombined * beta。绘制一条线,只需从某个范围的x中取样并添加b项

Xplot = [[0:.1:5].' ones(length([0:.1:5].'),1)];
Yplot = Xplot*beta;
plot(Xplot, Yplot);

那么为什么polyfit工作得那么糟糕?好吧,我无法肯定地说,但我的假设是你需要转置你的x和y矩阵。我猜这会给你一个更合理的路线。

x = x.';
y = y.';

然后尝试

p = polyfit(x,y,n)

我希望这会有所帮助。一个聪明的人曾经告诉过我(而且每天都在学习),不要相信你不理解的算法!

答案 2 :(得分:-1)

这里有一些测试代码可以帮助其他人处理线性回归和最小二乘

https://youtu.be/m8FDX1nALSE个matlab代码

如果你想测试

,可以手动制作

https://youtu.be/1C3olrs1CUw个好视频

function [a0 a1] = rtlinreg(x,y) 
  x=x(:);
  y=y(:);
  n=length(x);
  a1 = (n*sum(x.*y) - sum(x)*sum(y))/(n*sum(x.^2) - (sum(x))^2);  %a1 this is the slope of linear model
  a0 = mean(y) - a1*mean(x); %a0 is the y-intercept
end

x=[65,65,62,67,69,65,61,67]'
y=[105,125,110,120,140,135,95,130]'

[a0 a1] = rtlinreg(x,y);  %a1 is the slope of linear model, a0 is the y-intercept

x_model =min(x):.001:max(x);
y_model = a0 + a1.*x_model;  %y=-186.47 +4.70x   
plot(x,y,'x',x_model,y_model)