2014-01-20 27 views
2

是否有可能使用點的大小'重量'最適合的線?使用散佈點的大小重量線最適合matlab

x = [1 2 3 4 5]; 
y = [2 4 5 3 4]; 
s = [10 15 20 2 5]; 
scatter(x,y,s) 
hold on 
weight = s; 
p = polyfit(x,y,1); %how do I take into account the size of the points? 
f = polyval(p,x); 
plot(x,f,'-r') 
+1

您可以使用wieghted-least-square fit。有關matlab的示例的更多信息是[here](http://www.mathworks.com/matlabcentral/answers/98657)。 – Marcin

+0

感謝@Marcin - 查看了這個文檔,我弄不清楚如何使用這個函數。我會假設像'a = lscov(x,y,s)'來獲得座標?任何幫助將不勝感激。 – user2861089

+0

@ user2861089我擴展了Marcin的建議。這對你有幫助嗎? – buzjwa

回答

0

使用馬辛的建議,您可以將lscovpolyfit。正如documentation所解釋的那樣,通過計算xVandermonde matrixV,然後執行p = V\y來完成多項式擬合。這是任何最小二乘解的標準形式,並通過lscov將它自己應用於MATLAB中的加權最小二乘。

以你xyweight載體,而不是調用polyfit(x,y,n)你可以做到以下幾點:

% Construct Vandermonde matrix. This code is taken from polyfit.m 
V(:,n+1) = ones(length(x),1,class(x)); 
for j = n:-1:1 
    V(:,j) = x.*V(:,j+1); 
end 
% Solve using weighted-least-squares 
p = lscov(V,y,weight); 

你甚至可以更進一步,並修改polyfit.m本身包含此功能,或如果您不想修改原始MATLAB函數,請添加另一個函數polyfitw.m。但請注意,polyfit具有更多可選的結構輸出,使用QR分解計算,詳見文檔。將這些產出推廣到加權案例需要更多的工作。

0
x = (1:10)'; 
y = (3 * x + 5) + rand(length(x),1)*5; 
w = ones(1,length(y)); 

A = [x ones(length(x),1)]; 
p = lscov(A,y,w); 

plot(x,y,'.'); 
hold on 
plot(x,p(1)*x + p(2),'-r'); 
+5

你應該解釋你的答案 – anquegi

+0

歡迎來到Stack Overflow!雖然這個答案可能是正確和有用的,但是如果你包含一些解釋並解釋它是如何幫助解決問題的,那麼這是首選。如果存在導致其停止工作並且用戶需要了解其曾經工作的變化(可能不相關),這在未來變得特別有用。 –

+0

我會嘗試:lscov解決超定線性系統Ap = y +錯誤,其中w是每個x的權重向量。所以你正在求解p(1)x(1)+ p(2)= y(1); (1)x(2)+ p(2)= y(2)... p(1)x(n)+ p(2)= y(n)。 – MrBMX