1. 程式人生 > >最小二乘法

最小二乘法

mcc 希望 最小化 medium end ima ati 思想 esp

1、什麽是最小二乘思想?
簡單地說,最小二乘的思想就是要使得觀測點和估計點的距離的平方和達到最小.這裏的“二乘”指的是用平方來度量觀測點與估計點的遠近(在古漢語中“平方”稱為“二乘”),“最小”指的是參數的估計值要保證各個觀測點與估計點的距離的平方和達到最小。從這個上也可以看出,最小二乘也可用於擬合數據模型。

這當中涉及到如下問題:
①觀測點和距離點的距離:這個距離也被稱為誤差。既然要估計,總希望找到最好的估計值,那麽誤差越小越好。
②為什麽是距離的平方和:距離的平方和也就是誤差的平方和,既然誤差越小越好,那是否可以用絕對值來代替?;樓主覺得用絕對值代替的這個想法是可以的,只是在之後的運算求值時處理比較復雜。(樓主隱約記得取絕對值最小的方法好像是最小一乘法)
③為什麽平方求解方便呢?

那就要從公式講起了(樓主說好不上復雜公式推導的,好吧,這裏就簡單描述一下吧……)
設擬合直線是 技術分享 ,距離(或誤差)為 技術分享 ,那麽最小二乘的思想就是讓等式技術分享 具有最小值。那麽這就需要做求偏導了。(這也就是為什麽最小二乘有個要求就是數據需要具有二階矩),大致推導過程如下:
技術分享
整理後對方程組求解
技術分享
最終解得 技術分享

c++代碼實現

 1 /*
 2 最小二乘法C++實現
 3 參數1為輸入文件
 4 輸入 : x
 5 輸出: 預測的y  
 6 */
 7 #include<iostream>
 8 #include<fstream>
 9 #include<vector>
10
using namespace std; 11 12 class LeastSquare{ 13 double a, b; 14 public: 15 LeastSquare(const vector<double>& x, const vector<double>& y) 16 { 17 double t1=0, t2=0, t3=0, t4=0; 18 for(int i=0; i<x.size(); ++i) 19 { 20 t1 += x[i]*x[i];
21 t2 += x[i]; 22 t3 += x[i]*y[i]; 23 t4 += y[i]; 24 } 25 a = (t3*x.size() - t2*t4) / (t1*x.size() - t2*t2); // 求得β1 26 b = (t1*t4 - t2*t3) / (t1*x.size() - t2*t2); // 求得β2 27 } 28 29 double getY(const double x) const 30 { 31 return a*x + b; 32 } 33 34 void print() const 35 { 36 cout<<"y = "<<a<<"x + "<<b<<"\n"; 37 } 38 39 }; 40 41 int main(int argc, char *argv[]) 42 { 43 if(argc != 2) 44 { 45 cout<<"Usage: DataFile.txt"<<endl; 46 return -1; 47 } 48 else 49 { 50 vector<double> x; 51 ifstream in(argv[1]); 52 for(double d; in>>d; ) 53 x.push_back(d); 54 int sz = x.size(); 55 vector<double> y(x.begin()+sz/2, x.end()); 56 x.resize(sz/2); 57 LeastSquare ls(x, y); 58 ls.print(); 59 60 cout<<"Input x:\n"; 61 double x0; 62 while(cin>>x0) 63 { 64 cout<<"y = "<<ls.getY(x0)<<endl; 65 cout<<"Input x:\n"; 66 } 67 } 68 }

原理探究

數據擬合中,為什麽要讓模型的預測數據與實際數據之差的平方而不是絕對值和最小來優化模型參數?

這個問題已經有人回答了,見鏈接(http://blog.sciencenet.cn/blog-430956-621997.html)

個人感覺這個解釋是非常有意思的。特別是裏面的假設:所有偏離f(x)的點都是有噪音的。

一個點偏離越遠說明噪音越大,這個點出現的概率也越小。那麽偏離程度x與出現概率f(x)滿足什麽關系呢?——正態分布。

技術分享

已知N個點(用D來表示),求直線(用h來表示)出現的概率就可以表示為:P(h|D)

根據貝葉斯定理:P(h|D)=P(D|h)*P(h)/P(D)即P(h|D)∝P(D|h)*P(h) (∝表示“正比於”)

這就是一個生成模型了——由直線h生成點集D。

我們再作一個假設:h生成D中的每一個點都是獨立的(如果了解貝葉斯文本分類的話,這裏就很好理解了),那麽P(D|h)=p(d1|h)*p(d2|h)…

結合前面正態分布,我們可以寫出這樣的式子:p(di|h)∝ exp(-(ΔYi)^2)

那麽P(D|h)∝EXP[-(ΔY1)^2]* EXP[-(ΔY2)^2] * EXP[-(ΔY3)^2] * ..

又因為:ea*eb*ec=ea+b+c

所以p(D|h)∝ EXP{-[(ΔY1)^2 +(ΔY2)^2 + (ΔY3)^2 + ..]}

我們知道f(x)=ex的分布圖像為:

技術分享

因為e的指數永遠小於0,所以,想要p(D|h)最大,就必須使[(ΔY1)^2 + (ΔY2)^2 + (ΔY3)^2 + ..]無限接近於0,即:最大化p(D|h)就是要最小化[(ΔY1)^2 + (ΔY2)^2 + (ΔY3)^2 + ..]

到此,最小二乘法的原理得到了詮釋。

參考:http://www.cnblogs.com/iamccme/archive/2013/05/15/3080737.html

http://sbp810050504.blog.51cto.com/2799422/1269572

http://bbs.pinggu.org/thread-3041002-1-1.html

最小二乘法