我正在嘗試找到最適合數據的行。我使用下面的代碼,但現在我想將數據放入一個數組中排序,因此它具有最接近該行的數據,我該怎麼做?也是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,'-')
PS:我使用的是倍頻4.0,類似於Matlab的
我正在嘗試找到最適合數據的行。我使用下面的代碼,但現在我想將數據放入一個數組中排序,因此它具有最接近該行的數據,我該怎麼做?也是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,'-')
PS:我使用的是倍頻4.0,類似於Matlab的
你可以先計算出真正的價值y
與預測值之間的誤差f
err = abs(y-f);
然後對錯誤向量進行排序
[val, idx] = sort(err);
,並使用排序指標有你的y值排序
y2 = y(idx);
現在y2
具有作爲y
相同的價值觀,但那些接近擬合值第一。
執行相同的X來計算X2所以你必須X2和Y2
x2 = x(idx);
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)
我希望這有助於。一位智者曾告訴過我(每天都在學習),不要相信你不懂的算法!
下面是一些測試代碼,可以幫助別人處理線性迴歸和最小二乘
%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)
'x'和'y'是向量,轉置它們將不起作用。這個問題中的例子的迴歸結果很差,因爲您可以看到數據相關性非常低。迴歸不能做魔法,所以如果你想在低相關數據中擬合一條線,你應該會有一個很大的錯誤。無論如何,聰明人的好建議。 –