機器學習-最小二乘法

最小二乘法是機器學習中的基礎知識點,一致對最小二乘法的理解不夠深刻,今天就花點時間來深刻理解和探討一下最小二乘法html

最小二乘法,又稱最小平方法,基本公式通俗來說,兩者先取個差值,在來個平方,最後搞一個和號上去,這就是最小二乘問題的思想,下面介紹下算法

最小二乘法apache

   咱們以最簡單的一元線性模型來解釋最小二乘法。什麼是一元線性模型呢? 監督學習中,若是預測的變量是離散的,咱們稱其爲分類(如決策樹,支持向量機等),若是預測的變量是連續的,咱們稱其爲迴歸。迴歸分析中,若是隻包括一個自變量和一個因變量,且兩者的關係可用一條直線近似表示,這種迴歸分析稱爲一元線性迴歸分析。若是迴歸分析中包括兩個或兩個以上的自變量,且因變量和自變量之間是線性關係,則稱爲多元線性迴歸分析。對於二維空間線性是一條直線;對於三維空間線性是一個平面,對於多維空間線性是一個超平面...編程

   對於一元線性迴歸模型, 假設從整體中獲取了n組觀察值(X1,Y1),(X2,Y2), …,(Xn,Yn)。對於平面中的這n個點,可使用無數條曲線來擬合。要求樣本回歸函數儘量好地擬合這組值。綜合起來看,這條直線處於樣本數據的中心位置最合理。 選擇最佳擬合曲線的標準能夠肯定爲:使總的擬合偏差(即總殘差)達到最小。有如下三個標準能夠選擇:機器學習

        (1)用「殘差和最小」肯定直線位置是一個途徑。但很快發現計算「殘差和」存在相互抵消的問題。
        (2)用「殘差絕對值和最小」肯定直線位置也是一個途徑。但絕對值的計算比較麻煩。
        (3)最小二乘法的原則是以「殘差平方和最小」肯定直線位置。用最小二乘法除了計算比較方便外,獲得的估計量還具備優良特性。這種方法對異常值很是敏感。ide

  最經常使用的是普通最小二乘法( Ordinary  Least Square,OLS):所選擇的迴歸模型應該使全部觀察值的殘差平方和達到最小。(Q爲殘差平方和)- 即採用平方損失函數。函數

  樣本回歸模型:post

                                     其中ei爲樣本(Xi, Yi)的偏差學習

   平方損失函數:優化

                      

   則經過Q最小肯定這條直線,即肯定,以爲變量,把它們看做是Q的函數,就變成了一個求極值的問題,能夠經過求導數獲得。求Q對兩個待估參數的偏導數:

                       

    根據數學知識咱們知道,函數的極值點爲偏導爲0的點。

    解得:

                   

 

這就是最小二乘法的解法,就是求得平方損失函數的極值點。

 

最小二乘法分爲線性和非線性兩種,線性最小二乘法很好解決,能夠將公式(1)變換爲矩陣方程(公式2),最後直接求解矩陣方程便可,不須要迭代,這種解被稱爲「解析解」

 

(1)

(2)

 非線性最小二乘問題則否則,它要複雜得多,沒有辦法變換爲矩陣方程形式,以致於它必須將問題化簡爲每一步均爲能夠直接求解的子問題,整個求解過程是迭代的。

線性最小二乘問題與非線性最小二乘的關係,就是非線性最小二乘問題的求解過程。

1. 對原問題中的每個函數fi(x)在x0處進行一階泰勒展開,由於一階泰勒展開屬於線性函數(公式3),因而經過這種手段,就能夠將非線性最小二乘問題簡化爲線性最小二乘問題來求解。

               (3)

2. 對獲得的線性最小二乘問題,進行直接求解。這裏面涉及到兩個矩陣,一個是雅克比矩陣(公式4),一個是赫森矩陣(公式5)。

                        (4)

(5)

3. 獲得子問題的解析解xk+1以後(公式2),xk+1與xk之間便天然地創建了等式關係(公式6)。

(6)

4. 更新參數xk(k=k+1, k=1....n),回到步驟1,直到知足收斂條件,獲得最優解x*

 

沒錯,就是講非線性轉化爲線性問題去解決,下面說名幾個注意點:

第一:步驟1中,必定要一階泰勒展開,不能採用二階以上,由於只有一階泰勒展開纔是線性函數,才能轉換爲線性最小二乘問題來直接求解。

第二:步驟2中,雅克比矩陣和赫森矩陣都是屬於子問題的,不是原問題的。

第三:步驟3中,是爲了獲得新求解的參數xk+1與以前參數xk之間的關係,造成一種「鏈式反應」,也就是迭代了。

第四:步驟4中,收斂條件通常有1.梯度近乎爲0。2.變量變化很小。3.目標函數值變化很小等。

第五:許多優化算法,均可以用於解決非線性最小二乘問題。

第六:函數fi(x)每每都是以下形式(公式7),千萬別覺得fi(x)就是hi(x)

 

(7)

 

解釋完了,一團亂麻很正常,咱們致力於應用,能理解更好,實在理解不了就理解應用場景,畢竟如今都是面向場景式編程。

說白了,最小二乘法能夠獲得平方損失函數最小的點,也就是全局最小,通俗點就是擬合度比較好,因此咱們通常都是用於擬合數據創建線性模型用於預測

下面給出線性最小二乘法的Java實現:

複製代碼
package org.yujoo.baas.base;

/** 
 * 最小二乘法 y=ax+b 
 *  
 * @author yu joo
 *  
 */  
public class Theleastsquaremethod {  
  
    private static double a;  
  
    private static double b;  
  
    private static int num;  
  
    /** 
     * 訓練 
     *  
     * @param x 
     * @param y 
     */  
    public static void train(double x[], double y[]) {  
        num = x.length < y.length ? x.length : y.length;  
        calCoefficientes(x,y);  
    }  
  
    /** 
     * a=(NΣxy-ΣxΣy)/(NΣx^2-(Σx)^2) 
     * b=y(平均)-a*x(平均) 
     * @param x 
     * @param y 
     * @return 
     */  
    public static void calCoefficientes (double x[],double y[]){  
        double xy=0.0,xT=0.0,yT=0.0,xS=0.0;  
        for(int i=0;i<num;i++){  
            xy+=x[i]*y[i];  
            xT+=x[i];  
            yT+=y[i];  
            xS+=Math.pow(x[i], 2.0);  
        }  
        a= (num*xy-xT*yT)/(num*xS-Math.pow(xT, 2.0));  
        b=yT/num-a*xT/num;  
    }  
  
    /** 
     * 預測 
     *  
     * @param xValue 
     * @return 
     */  
    public static double predict(double xValue) {  
        System.out.println("a="+a);  
        System.out.println("b="+b);  
        return a * xValue + b;  
    }  
  
    public static void main(String args[]) {  
        double[] x = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } ;    
        double[] y = {23 , 44 , 32 , 56 , 33 , 34 , 55 , 65 , 45 , 55 } ;    
        Theleastsquaremethod.train(x, y);  
        System.out.println(Theleastsquaremethod.predict(10.0));  
    }  
  
}  
複製代碼

 固然若是你不想寫也可使用Apache開源庫commons math,提供的功能更強大,

http://commons.apache.org/proper/commons-math/userguide/fitting.html

 

<dependency>  
          <groupId>org.apache.commons</groupId>  
            <artifactId>commons-math3</artifactId>  
            <version>3.5</version>  
 </dependency>  

 

複製代碼
private static void testLeastSquareMethodFromApache() {  
        final WeightedObservedPoints obs = new WeightedObservedPoints();  
        obs.add(-3, 4);  
        obs.add(-2, 2);  
        obs.add(-1, 3);  
        obs.add(0, 0);  
        obs.add(1, -1);  
        obs.add(2, -2);  
        obs.add(3, -5);  
  
        // Instantiate a third-degree polynomial fitter.  
        final PolynomialCurveFitter fitter = PolynomialCurveFitter.create(3);  
  
        // Retrieve fitted parameters (coefficients of the polynomial function).  
        final double[] coeff = fitter.fit(obs.toList());  
        for (double c : coeff) {  
            System.out.println(c);  
        }  
    }
複製代碼

最小二乘法使用的前提條件是數據連續的而非離散,最常使用的場景就是迴歸模型,在監督學習中,若是預測的變量是離散的,咱們稱其爲分類(如決策樹,支持向量機等),若是預測的變量是連續的,咱們稱其爲迴歸。迴歸分析中,若是隻包括一個自變量和一個因變量,且兩者的關係可用一條直線近似表示,這種迴歸分析稱爲一元線性迴歸分析。若是迴歸分析中包括兩個或兩個以上的自變量,且因變量和自變量之間是線性關係,則稱爲多元線性迴歸分析。對於二維空間線性是一條直線;對於三維空間線性是一個平面,對於多維空間線性是一個超平面。最小二乘法就是迴歸問題解決的基本方法,同時,最小二乘法在數學上稱爲曲線擬合。

 

參考1:最優化理論與算法

參考2:利用Levenberg_Marquardt算法求解無約束的非線性最小二乘問題~

參考3:利用信賴域算法求解無約束的非線性最小二乘問題~

參考4:http://blog.csdn.NET/wsj998689aa/article/details/41558945

相關文章
相關標籤/搜索