1、最小二乘原理
Matlab直接實現最小二乘法的示例:
close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; yrand = y + 0.5*rand(1,size(y,2)); %%最小二乘擬合 xf=log(x); yf=yrand; xfa = [ones(1,size(xf,2));xf] w = inv(xfa*xfa')*xfa*yf';%直接擬合得到的結果
參考資料:
1、http://blog.csdn.net/lotus___/article/details/20546259
2、http://blog.sina.com.cn/s/blog_5404ea4f0101afth.html
2、matlab呼叫函式實現最小二乘法
利用matlab的最小二乘擬合函式對非線性函式進行擬合,具體地擬合的函式:
[q r] = lsqcurvefit(fun, q_0, xdata, ydata);
輸入引數:
fun:需要擬合的函式,假定有n個需要擬合的引數,那麼 q = [q1,q2,...,qn]
q_0:表示使用者給定的一個起始點
xdata:函式的自變數
ydata:函式的因變數
輸出引數:
q:表示求解得到的最優引數
r:表示最小二乘的目標函式值,即殘差。
實現程式碼
close x = 1:1:100; a = -1.5; b = -10; y = a*log(x)+b; plot(x,y); yrand = y + 0.5*rand(1,size(y,2)); plot(x,yrand,'ro'); %%最小二乘擬合 xf=log(x); yf=yrand; f=inline('a(1)+a(2).*x','a','x'); [q,r]=lsqcurvefit(f,[1,0],xf,yf) plot(x,yrand,'ro','LineWidth',2) %繪製圖表 hold on; %%繪製擬合曲線 yn = q(1)+q(2)*log(x); hold on; plot(x,yn,'b','LineWidth',2); %%設定Legend hleg = legend(['原始函式(y=' num2str(b,3) '+' num2str(a,3) 'ln(x)' ')資料'],['擬合結果:y=' num2str(q(1),3) '+' num2str(q(2),3) 'ln(x)'],'Location','NorthEast');%本身不能設定字型的大小,需要通過set進行設定 set(hleg,'FontSize', 15, 'FontAngle','italic','FontWeight','bold',... 'TextColor',[.6,.2,.1],'Color',[1,1,1]);%Color為設定座標的背景顏色 %%設定標題 title('最小二乘擬合:y=a+b*ln(x)','Color','k','FontSize',20); %%座標軸標題設定 xlabel('x','Color','k','FontSize',15);%橫軸標題 ylabel('y','Color','k','FontSize',15);%縱軸標題 %%儲存影象 set(1, 'InvertHardCopy', 'off');%設定的背景色有效,如果為on則圖形不儲存背景色,maltab 預設為 on filename = 'lnx'; print(1, '-djpeg', filename);%其他格式 -djpeg,-dpng,-dbmp,-dtiff,-dgif
擬合結果
如下圖所示
3、Excel的實現
使用 lenest函式進行最小二乘擬合,對以上生成的資料進行擬合,擬合結果和matlab是一致的。
已知擬合函式y=ax+b,那麼
斜率計算公式為:
a = lenest(ydata,xdata,,FALSE)
截距計算公式為:
b = index(lenest(ydata,xdata),,FALSE),2)
擬合的程式碼,請查閱附件:最小二乘擬合.xlsx,包含了帶噪聲的原始資料,擬合公式,擬合結果圖
擬合結果如下圖所示: