最近在看bishop的pattern recognition and machine learning,裡面講的多項式擬合非常透徹,所以根據該書中的例子再對這個方面進行擴充。
首先我們隨機取
由圖可知,當k=1時,擬合的效果是非常差的,而當k=3時,擬合得到的曲線就比較接近
在實際情況中,我們獲得的訊號往往是帶有雜訊的,所以如果我們對得到的資料完全擬合,那麼就會引入雜訊,這是不能接受的。我們可以從root-mean-square(rms)error來判斷擬合的結果的好壞。
隨機取計算得到的曲線100個點,計算其e(rms)(為了計算方便,tn直接取sin上面的點),得到當k=3時,e(rms)=0.2844,而當k=12時,e(rms)=9.9938。更直觀的,當k=3時,w=[0.1664,8.4490,-26.5924,17,9262],當k=12時,w=[-269.6461, 13129.8357, -244471.6788 . . .],可以看出當k過大時,其對應的係數會變得非常大,在影象的體現為劇烈波動。因此為了避免這種情況的發生,學者們加入了乙個正則項來約束w中值得大小
具體求解也是對w求導,其中lambda決定了這個正則項在公式中的重要程度,具體選擇方法可以參見上文提到的prml,這裡就不做**實驗了。
最後附上**,**沒有經過仔細的檢查,裡面的變數也不是很規範,如果裡面有何錯誤,請大家指出來。
clc;
clear;
num=20;
x=rand(1,num);
y=;for i=1:size(x,2)
y=[y, sin(2*3.14*x(i))];
endyn = awgn(y,10,'measured');
i=ones(1,num);
x=[i; x; x.^2; x.^3];
y=yn;
a=y/x;
y2=a(1)+a(2)*x+a(3)*x.^2+a(4)*x.^3;
x_test=rand(1,100);
y_test=;
y_test_ori=;
for i=1:size(x_test,2)
y_test_ori=[y_test_ori, sin(2*3.14*x_test(i))];
y_test=[y_test, (a(1)+a(2)*x_test(i)+a(3)*x_test(i)^2+a(4)*x_test(i)^3)];
end% y_test_ori_n = awgn(y_test_ori,10,'measured');
y_test=y_test-y_test_ori;
y_train=y-y2;
e_test=sqrt(sum(y_test.^2)/100);
e_train=sqrt(sum(y_train.^2)/10);
figure;
set(0,'defaultfigurecolor','w')
[a,b]=sort(x);
plot(a,y2(b),'b');
hold on;
scatter(x,yn,'r');
hold on;
x_ori=0:0.01:1;
y1=sin(2*3.14*x_ori);
plot(x_ori,y1,'g');
最小二乘法
include stdafx.h include include const int n 2 const int m 5 int sgn double x void lss double g n 1 int xm,int xn,double x m double p,double w m lss函式...
最小二乘法
在研究兩個變數之間的關係時,可以用回歸分析的方法進行分析。當確定了描述兩個變數之間的回歸模型後,就可以使用最小二乘法估計模型中的引數,進而建立經驗方程.簡單地說,最小二乘的思想就是要使得觀測點和估計點的距離的平方和達到最小.這裡的 二乘 指的是用平方來度量觀測點與估計點的遠近 在古漢語中 平方 稱為...
最小二乘法
最小二乘法 least squares analysis 是一種 數學 優化 技術,它通過 最小化 誤差 的平方和找到一組資料的最佳 函式 匹配。最小二乘法是用最簡的方法求得一些絕對不可知的真值,而令誤差平方之和為最小。最小二乘法通常用於 曲線擬合 least squares fitting 這裡有...