2017-02-28 47 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)