多元線性迴歸:梯度下降法與最小二乘法;歸一化與局部加權;簡單對比

機器學習(4)


在一元線性迴歸的梯度下降法最小二乘法中介紹了二者的原理以及公式推導的過程。
在處理多元問題時,這兩種方法的原理依舊不會有變化,只是在訓練模型時添加了矩陣的計算。

梯度下降法

程序實現

首先來回顧一下E的計算公式公式1.1.1
在這裏插入圖片描述
多元線性迴歸的梯度下降程序原理和一元線性迴歸沒有區別,在設定好學習率a後就可以代入訓練集計算:
訓練集和初始化的K是形似如圖的矩陣:
在這裏插入圖片描述
先初始化一些變量:

err = np.sum(X*K - Y) #誤差
e = 10e-8 #我們允許的兩次E差值的最大值
m = len(Y) #樣本點數
a = 0.001 #初始化學習率,可能不適合這一組數據
E  = 0 #本次E
E0 = 0 #上次E
A=[0.,0.,0.] #存儲當前導數值

計算E

E = err**2/2/m

求導

        for i in range(len(K)):
                A[i] = np.sum(err * X[:,i] ) / m

再梯度下降

        for i in range(len(K)):
                K[i] -= a*A[i]

然後判斷 abs(E-E0) 是否 < e,是則break
否則

E0 = E #記錄本次E的值
E = 0 #重置E

然後再循環,直到 abs(E-E0) < e

如果爲了方便,我們可以把上式堆到while True語句裏。
(其實a應該寫成alpha,而K應該寫成theta,其實都是一個東西)

我們也可以把它們寫成函數,然後封裝到一起,就不詳細寫了。在這裏主要想介紹接下來的知識點:歸一化
歸一化有兩種基本的方式,分別是線性函數歸一化和0均值歸一化:

線性函數歸一化

公式1.2.1
在這裏插入圖片描述
Xmax 和 Xmin分別是這一組中的最大和最小值,X是未歸一化的舊數據,X‘是歸一化以後的新數據。

0均值標準化

公式1.2.2
在這裏插入圖片描述
μ是樣本數據的均值,σ是樣本數據的標準差。

兩種歸一化的區別

由於在我的專業中涉及控制、信號等問題較多,對我個人而言,歸一化十分重要。剛剛介紹的兩種歸一化是各有適用場景的。

二者的直接區別如圖:

在這裏插入圖片描述

  • 線性函數歸一化的顯著特徵就是:等比例縮放

比如,有28個[0, 4095]區間的數據,在歸一化以後,這28個數據依舊保持原有的倍數;
或者在圖像處理時,由RGB圖像轉化爲灰度圖像以後,每個像素點的灰度都是在[0, 255]區間裏,並且各個數據依舊保持原有的比例。

我們並不希望歸一化以後的各數據之間的比例發生改變,防止控制器造成錯誤的判斷,這時,我們就需要用到類似線性函數歸一化這樣的方法處理數據。

  • 而0均值歸一化,往往適用於需要去量綱化、距離度量、降維等情況。

什麼叫去量綱化呢?簡單地說就是把各個數據之間單位的差別給去掉。
常見的距離度量有歐氏距離、曼哈頓距離等等。
降維就是把一些複雜的高維的數據轉化成低維度,便於我們計算、可視化等等。
(這三條說得很淺,在這裏只是簡略地提一下)
比如:
現有訓練集:
x1=[1 2 8 4 6](陽臺數)
x2=[9856, 8759, 7653, 9472, 8991](使用面積)
y=[430.608, 389.087, 375.079, 430.896, 421.413](房子價格)
(這是與實際不符的數據,僅舉反例用)
最後算出來的θ應是[1.2, 5.6, 0.043]。(b、k1、k2)。

若我們沒有使用歸一化,由於單位的不統一,程序在計算的時候很容易就會溢出:
在這裏插入圖片描述
不想溢出的話,又要經過非常多次的運算:
在這裏插入圖片描述
當我們需要對這樣的訓練集進行線性擬合時,若不歸一化,程序在梯度下降的時候效率會非常低,最終結果可能也不是很好。此時我們就需要類似0均值歸一化這種能夠去量綱的歸一化方法,來保證梯度下降的效率。

兩種方式各有優劣,在歸一化數據的時候需要我們自己根據實際情況選擇方法。

最小二乘法

計算公式

公式2.1.1
在這裏插入圖片描述
公式來源在已經在上一期的末尾講過了,雖然上一期是用的一元線性迴歸解釋,不過其原理是一樣的。

程序實現

(列向量)

K = (X.T * X).I * X.T * Y

實現原理雖然很簡單,但是隻適合線性的數據擬合,在面對非線性的數據,或者樣本點不夠多時計算出的結果往往會發生欠擬合現象。

爲了解決欠擬合的問題,我們可以給某些點增加一點權重,人爲引入偏差,從而減小整體的均方誤差。比如接下來將介紹的“局部加權

局部加權

先放公式,隨後解釋:公式2.2.1
在這裏插入圖片描述

與前文的公式相比多了一個W對角矩陣,權重矩陣。
求權重最常用的公式如圖:公式2.2.2
在這裏插入圖片描述
到後面我們就會知道,這是高斯覈對應的權重。其中,x是我們要加權的點;xi是其他樣本點,x和xi越接近,w(i,i)越大。
k是我們自己選定的參數,k越小,x點附近被用於訓練迴歸模型的點越少。

例:
若我們要給樣本的第一個數據加權,即X[0]

m = len(Y)
w = np.eye(m) #創建對角矩陣
k = 0.1 #這個值僅舉例用
for i in range(m):
    X_X = X[0] - X[i,:]
    w[i,i] = exp(X_X * X_X.T / (-2.0*k**2))

如此我們便完成了單個點的加權,然後再代入公式2.2.1計算出K:
即.

K = (X.T * w * X).I * X.T * w * Y

然後再計算出,由這個經過加權後的點預測的值:

Y[0] = K*X[0]

但這僅僅是一個點的加權,而且想這麼寫程序很麻煩,我們可以把其他的點也分別加權:

  • 我們先把剛剛的單個點程序寫爲函數:
def One_Point(Xtest,X,Y,k):# Xtest是我們要加權的樣本點
    # 略
    return K*Xtest
  • 然後就可以不斷調用它,從而給其他點加權後再預測值
for i in range(m):
    Y[i] = One_Point(X[i],X,Y,0.1)

用局部加權方法,可以適當地解決一些欠擬合的問題。

簡單地對比

最小二乘法 梯度下降法
公式計算 迭代計算
無學習率 有學習率
不需歸一化 需要歸一化
與起點無關 與起點有關
全局最小 局部最小

最小二乘法的優點就是可以由公式直接得到線性迴歸方程,但是計算過於複雜。
當樣本點和特徵值過多時,比如有100 000個樣本點,10 000個特徵值的時候,用最小二乘法就會對計算機造成很大的負擔,耗費很長時間。此時我們就應該用梯度下降法。
有時XTX並沒有逆矩陣,面對這樣或者其他的複雜情況時,梯度下降法往往是更好的選擇。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章