2017-02-28 44 views
1

我正在尝试找到最适合数据的行。我使用下面的代码,但现在我想将数据放入一个数组中排序,因此它具有最接近该行的数据,我该怎么做?也是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:我使用的是倍频4.0,类似于Matlab的

回答

2

你可以先计算出真正的价值y与预测值之间的误差f

err = abs(y-f); 

然后对错误向量进行排序

[val, idx] = sort(err); 

,并使用排序指标有你的y值排序

y2 = y(idx); 

现在y2具有作为y相同的价值观,但那些接近拟合值第一。

执行相同的X来计算X2所以你必须X2和Y2

x2 = x(idx); 
1

Sembei Norimaki做了解释您的主要问题的一个好工作之间的对应关系,所以我会看你的次要问题=是polyfit正确的功能?

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

如果它必须是“线”,我们可以使用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) 

我希望这有助于。一位智者曾告诉过我(每天都在学习),不要相信你不懂的算法!

+0

'x'和'y'是向量,转置它们将不起作用。这个问题中的例子的回归结果很差,因为您可以看到数据相关性非常低。回归不能做魔法,所以如果你想在低相关数据中拟合一条线,你应该会有一个很大的错误。无论如何,聪明人的好建议。 –

-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)