1. 程式人生 > >機器學習筆記 1 LMS和梯度下降(批梯度下降) 20170617

機器學習筆記 1 LMS和梯度下降(批梯度下降) 20170617

temp eas 理解 import 樣本 alt mes show 超過

# 概念

LMS(least mean square):(最小均方法)通過最小化均方誤差來求最佳參數的方法。

GD(gradient descent) : (梯度下降法)一種參數更新法則。可以作為LMS的參數更新方法之一。

The normal equations : (正則方程式,將在下一篇隨筆中介紹)一種參數更新法則。也可以作為LMS的參數更新方法之一。

三者的聯系和區別:LMS是一種機器學習算法。但是最小化均方誤差的方法不唯一,采用GD或者正則方程式都是方法之一。

# 準備樣本

必須要先理解樣本集X的排布:

技術分享

    

  為了方便敘述,我們定義樣本特指一個樣本,樣本集特指一整個樣本矩陣。

  大寫 X 表示樣本集矩陣。排布:一行是一個樣本。

  小寫 x 表示樣本集矩陣的元素。x的上標:樣本序號(這個括號只是為了區別於指數,記號而已);x的下標:樣本的維度。

  這個樣本集有3個樣本,每個樣本2維。

  * 樣本的維度和所需要擬合的參數個數相同。(後續會說明,先不急提問)

  大寫Y表示所有樣本的結果的集合的矩陣。

  小寫y的上標:第i個樣本的結果。

  * 樣本的結果,也就是Y矩陣的元素數量和樣本的數量相同.

  X和Y的關系:從一個樣本來看,一個樣本(2維度)通過映射得到y。

  LMS的目的:通過假設這種映射關系為如下,估計出最匹配的參數theta。至於該怎麽更新參數,就是GD和正則方程的任務了。

技術分享

    式中的h就是樣本估計值(y是樣本的實際值);matrixθ是參數θ組成的列矩陣;matrixX是樣本按列排的矩陣,亦即以上的大寫X。

    沒有和吳恩達大神的講義一致,但是我覺的h的公式應該是沒問題的,mX是行,mθ是行。這點歡迎大家討論,我也有點困惑

  使用 n 表示樣本的維度

  使用 m 表示樣本的數量

# 數學說明

LMS表示:最小化均方誤差求參數的方法,首先要給出均方誤差的定義

1. 均方誤差

技術分享

參數說明:

  m 是樣本的數量

  i 是樣本的數量,樣本總數是m,參見樣本X的說明

  J 是cost function ,損失函數。J的形式就是“均方”。

  h 就是估計的映射關系(但是自變量其實是一個行矩陣),自變量x加上標:表示的是第i個樣本,行矩陣輸入到h中。h(x)得到是一個值。

  y 加上標:表示第i個樣本的實際輸出值

LMS的目的:就是找到使得J最小的參數θ(矩陣),認為這就是h的最優參數,此時的h最接近樣本的真實輸出y。

問題轉化為:求最小化J的參數θ(矩陣),θ的最優解問題。

方法之一:梯度下降。實際上是:在每次叠代中,提出了一種θ的更新法則

2. 梯度下降的應用

  梯度下降的表達式:

技術分享

頭暈了,來,解釋一下。

(1)是梯度下降的定義式,其中α表示學習率,根據經驗設置(後面的例子中,設置為0.01)。θ這裏是矩陣,帶下標的是θ內的元素,可參看(2)。

(2)是梯度的計算過程。將J的定義代入,m表示樣本數量。下標 j 表示的是維度的序號,這裏表示的是參數的序號。參數的序號和維度序號,這裏講解一下:

技術分享
  註意,這裏樣本增加了一維x0,原因參見#樣本準備

  為了滿足h的形式,所以我們設置參數θ的矩陣為[θ0,θ1,θ2]。

  這裏x的上標是為了強調這是第i個樣本。x的下標是維度。

  參數的數量和樣本維度一致,這樣看起來就顯然啦。

  這裏就註意到了,式中 x上標i 就是矩陣,θ這裏也是矩陣。

  這裏也沒有吳恩達大神的講義一致。

(3)計算偏微分,求和號要是不理解,寫兩項算一下就知道了。y上標i 是數值,對θ下標j求導為零。h對θ下標j求導得x下標j上標i

(4)(5)就是最後的結果,其中(5)是每項θ下標j的更新法則。

數學推導的(5)一般不直接拿來寫成代碼,因為代碼實現上,矩陣形式更有優勢。

3. 梯度下降的矩陣表達式

技術分享

  其中:θ和 x上標i 是矩陣,定義參見2(2);X和Y也是矩陣,參見#準備樣本

  矩陣形式的好處是,求和過程被簡單的表達(行矩陣*列矩陣=值),代碼實現就方便了。

  每次叠代,自變量就是第i個樣本(x上標i),因變量就是參數矩陣(θ)。

  

至此,就可以準備開始寫代碼了。

# matlab例程

function LMS_GD()
% 參數準備 m表示矩陣
% mX每行是一個樣本,樣本按照列排列
% mY是每個樣本的輸出值,按列排列
% mTheta是參數矩陣,按照行排列,參數數量=樣本維度
% alpha是學習率
mX = [1,1; 1,2; 1,3; 1,4; 1,5; 1,6; 1,7; 1,8; 1,9]; 
mY = [1.1; 1.5; 2.1; 2.9; 3.5; 4.4; 5.1; 6.7; 8.3];
mThetas = [0.1, 0.1];
alpha = 0.001;

% 應該註意,超過二維的樣本及其輸出結果是畫不出來的。
% mX的第一列是x下標0,令其等於1,為了形式統一。要是為了簡單,去掉也可以
%   那mX就變成了一維的
% 本例,使用mX的第二列作為x坐標,mY為y坐標繪制圖形。
plot(mX(:,2),mY,o);
hold on;

% 以下的計算過程,在上面的講解中已經很詳細了,來一個萬惡的字...
%   略。
error = 1.0;
for i = 1:1000 i % 為了顯示 mTemp = (mY - mX*mThetas); mThetas = mThetas + alpha * mTemp*mX; lasterror = error; error = 0.5*mTemp*mTemp if(abs(error-lasterror) < 0.1) break; end end mNewY = mX*mThetas; plot(mX(:,2), mNewY,r); end

技術分享

# Python例程(3.5)

需要numpy庫的支持(free and easy to install)

需要matplotlib庫的支持(free and easy to install)

from numpy import *
import matplotlib.pyplot as plt 

def LMS_GD() :
    # 準備樣本
    mX = mat([[1,1], [1,2], [1,3], [1,4], [1,5], [1,6], [1,7], [1,8], [1,9]])
    mY = mat([1.1, 1.5, 2.1, 2.9, 3.5, 4.4, 5.1, 6.7, 8.3])
    mY = mY.T # 轉置
    mThetas = mat([0.1, 0.1])
    alpha = 0.001 # 太大可能造成不收斂,太小速度太慢

    # 顯示
    mlx = mX[0:,1] # 取第二列(序號0初始)
    lx = mlx.tolist();
    ly = mY.tolist();
    plt.plot(lx, ly, ro);
    # plt.show()
    
    # 叠代
    error = 1.0
    for i in range(1000) :
        print(run %d times: error = %d % (i, error))
        
        mTemp = (mY - mX*mThetas.T)
        mThetas = mThetas + alpha * mTemp.T * mX

        lasterror = error;
        error = 0.5*mTemp.T * mTemp

        if abs(error-lasterror) < 0.1 :
            break;


    # 顯示
    mNewY = mX*mThetas.T
    ly = mNewY.tolist()
    plt.plot(lx, ly,)
    plt.show()

    return True

技術分享

Bingo!

以上。

機器學習筆記 1 LMS和梯度下降(批梯度下降) 20170617