我想將多項式擬合到有噪數據,以使近似多項式始終> =原始數據。例如:將多項式擬合到函數的最大值
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
有沒有更好的辦法/方法,它也可以與高階多項式?
的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
但你可以看到,優化和評估聚了點<這是不允許的原單點。
您是否嘗試過適合所有數據點的行,然後查找錯誤率最高的行? – Crowley
我猜你正在尋找的是fmincon: 最小化規範(如2範數)與(線性)FUN約束(配製成的願望多項式的大小的矩陣A *點的數量)和你的觀察值作爲乙 從MATLAB幫助: X = fmincon(FUN,X0,A,B)開始於X0和發現的最小X到 函數FUN,受線性不等式A * X <= B. FUN接受 輸入X並返回在X處評估的標量函數值F.X0可以是標量,向量或矩陣的 。 –
@AlexanderKemp:看起來很有前途,但我想使用GNU Octave,而fmincon顯然還沒有實現。 – Andy