機器學習筆記 1 LMS和梯度下降(批梯度下降) 20170617
# 概念
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