2016-04-18 28 views
7

我想將多項式擬合到有噪數據,以使近似多項式始終> =原始數據。例如:將多項式擬合到函數的最大值

x = linspace (-2, 6); 
y = (x-2).^2 + 1 + 2 * randn (size (x)); 

function ret = delta (P, x, y) 
    yP = polyval (P, x); 
    d = yP - y; 
    d (d < 0) *= 1000; 
    ret = sumsq (d); 
endfunction 

P0 = polyfit (x, y, 2); 
f = @(P) delta (P, x, y); 
[P, FVAL] = sqp (P0, f) 

xi = linspace (min(x), max(x), 100); 
yi = polyval (P, xi); 

plot(x, y, xi, yi); 
grid on 

original (blue) and approx. (green) data

有沒有更好的辦法/方法,它也可以與高階多項式?

的easies的方法是隻使用polyfit,然後計算max(y-yi)並添加爲抵消但這不是最佳...

編輯:我想用GNU八度,但補充說:「MATLAB」爲標籤,因爲語言和功能是相似的。

編輯:基於TVO的答案和真實的數據:

x = [10 20 30 40 50 60 80 100]; 
y = [0.2372, 0.1312, 0.0936, 0.0805, 0.0614, 0.0512, 0.0554, 0.1407]; 

function ret = delta (P, x, y) 
    ret = sumsq (polyval (P, x) - y); 
endfunction 

f = @(P) delta (P, x, y); 
h = @(P) polyval(P, x) - y; 

P0 = polyfit (x, y, 3); 
[P] = sqp (P0, f, [], h) 

xi = linspace (min(x), max(x)); 
yi = polyval (P0, xi); 
yio = polyval (P, xi); 

plot(x, y, xi, yi, ";initial guess;", xi, yio, ";optimized;"); 
grid on 

tvos result plot

但你可以看到,優化和評估聚了點<這是不允許的原單點。

+0

您是否嘗試過適合所有數據點的行,然後查找錯誤率最高的行? – Crowley

+2

我猜你正在尋找的是fmincon: 最小化規範(如2範數)與(線性)FUN約束(配製成的願望多項式的大小的矩陣A *點的數量)和你的觀察值作爲乙 從MATLAB幫助: X = fmincon(FUN,X0,A,B)開始於X0和發現的最小X到 函數FUN,受線性不等式A * X <= B. FUN接受 輸入X並返回在X處評估的標量函數值F.X0可以是標量,向量或矩陣的 。 –

+0

@AlexanderKemp:看起來很有前途,但我想使用GNU Octave,而fmincon顯然還沒有實現。 – Andy

回答

4

你的方法似乎罰款,我認爲沒有理由不能實際使用的高階多項式。請解釋爲什麼如果你認爲它不能使用。

您正在使用Octave的'sqp'解算器。文檔是在這裏:http://www.gnu.org/software/octave/doc/v4.0.1/Nonlinear-Programming.html

你可能想避免(在你的榜樣1000)的錯誤用任意數目乘以爲負時。這對於不同的數據集可能會失敗,特別是如果它們較大,即更多的數據點。

你可以嘗試使用非線性不等式約束選項,八度的「小數量議定書」的優惠,即H(X)> = 0(見文檔)。

作爲目標函數披可以使用模的平方誤差,作爲在你的例子,並添加形式H(X)> = 0的約束每一個數據點。請注意,'x'是您想要擬合的多項式係數,h(x)是在特定數據點處評估的多項式。

例如:

phi = @(P) delta_mod (P, x, y); % mod: Don't increase the importance of negative residuals!! 
h = @(P) polyval(P, x1) - y1; 

Psol = sqp(P0, phi, [], h); 

注意,約束函數的「h」確保了多項式將位於上述(X1,Y1),並且目標函數「披」將試圖保持它儘可能接近可能。您可以擴展'h'來爲集合中的每個數據點包含一個約束(請參閱doc)。

+0

我已經更新了我的答案並添加了建議更改的結果,但結果多項式的點數<原始數據(請參閱我的問題中的圖)。任何提示? – Andy

+0

喜安迪,藍線包含原始數據,對不對?也許將它們繪製成單獨的標記(點或十字)以避免數據和擬合之間的混淆。關於這個問題,我認爲設置是正確的。現在,初始猜測'P0'也位於一些數據點之下。最終結果確實做得更好,但還不夠好。我假設算法聲明過早收斂。看看'sqp'的文檔(我的答案中的鏈接),並用'maxiter'和'tol'來玩,看看是否有效果。查看輸出中的'info',看看爲什麼'sqp'結束。 – tvo