對如下圖所示的加雜訊曲線,如何進行曲線擬合呢?
我們可以採用d階多項式去逼近它:
係數隨機資料的產生如下:
function [y_truth,y_observed] = unknown_model1(x)
y_truth = 0.001*x.^4 + x.^3-5*x.^2+0.5*x; %4階的資料
y_observed = y_truth + randn(length(x),1)'; %觀測到的資料報含單位高斯雜訊
end
整個演示程式如下:
clc;
clear;
close all;
%% sample
x_all = 0:0.1:10;
[y_truth_all,y_all]=unknown_model1(x_all);
n = length(x_all);
%use the first half for training
x = x_all(1:n/2);
y = y_all(1:n/2);
y_truth = y_truth_all(1:n/2);
plot(x,y_truth,'g-x','linewidth',1.5);
hold on;
plot(x,y,'m-x','linewidth',1.5);
legend('model truth','observation');
title('training');
%% curve fitting, try linear model
x = [x;ones(1,length(x))]';
y = y';
lambda1 = (x'*x)\x'*y; %最小二乘擬合 (least-square fitting)
lambda2 = (x'*x)\x'*y;%最小二乘擬合
lambda3 = (x'*x)\x'*y;%最小二乘擬合
以上是訓練的**。由圖可見,3階和5階與真實模型最為接近,一階的誤差較大。
下面根據估計的模型對未來未知的資料進行**,比較各模型與真實模型的誤差大小
由圖可見,3階模型與真實模型最為接近,而原來在訓練中比較接近的5階模型對未知資料有較大的誤差,即存在所謂的過擬合現象(overfitting)[2].
最小二乘法曲線擬合
設有如下實驗資料x1 2345 6789 1011 1213 141516y 46.4 88.8 9.22 9.59.7 9.86 1010.2 10.32 10.42 10.5 10.55 10.58 10.60 試用最小二乘法多次 1到5次 多項式曲線擬合以上資料。import numpy as...
最小二乘法曲線擬合
在實際工程中,我們常會遇到這種問題 已知一組點的橫縱座標,需要繪製出一條盡可能逼近這些點的曲線 或直線 以進行進一步進行加工或者分析兩個變數之間的相互關係。而獲取這個曲線方程的過程就是曲線擬合。首先,我們從曲線擬合的最簡單情況 直線擬合來引入問題。如果待擬合點集近似排列在一條直線上時,我們可以設直線...
最小二乘法的曲線擬合
最小二乘法的曲線擬合 bool cdatadistillview leastdoublemultiplication long px,long py,long m,long n,double result,double warp for i 0 i m i z 0 b 0 1 d1 n p 0 c ...