機器學習 深入理解區域性加權線性回歸 原始碼實現

2021-10-09 05:27:43 字數 2471 閱讀 5811

線性回歸是在已有資料的基礎上,通過建立含有未知引數的線性模型來擬合樣本點。通過已有資料確定未知引數後,就可用回歸模型來**其他輸入狀態下的輸出值。

一般地,線性回歸分為標準線性回歸(standard lr)和區域性加權線性回歸(locally weighted lr)兩種。其區別在於:前者對所有的樣本點共享乙個權重矩陣,權重矩陣由全域性mse得出;後者每個樣本點使用乙個權重矩陣,權重矩陣由核函式與mse共同決定。下面從乙個例項考慮二者的區別。

圖1(i)

圖1(ii)

考慮如圖1(i)所示的資料集,用標準線性回歸直觀上並不恰當,似乎用曲線可以擬合得更好,這是全域性共享權重矩陣的弊端。如圖1(ii)所示,將某個樣本點 x

ix_i

xi​及其鄰域內的點視為乙個元集合a

aa,對a

aa進行標準線性回歸以得到回歸直線 ,將樣本中的所有元集合對應的回歸直線連線起來,就形成了對整個樣本集的擬合。換言之,這是用區域性最優擬合全域性最優,用線性擬合非線性模型。

區域性加權線性回歸的核心原理在於如何計算出乙個元集合並進行標準線性回歸。這裡引入的是高斯核函式:

k (x

i,xj

)=e−

(xi−

xj)2

2σ2k(x_i,x_j)=e^}

k(xi​,

xj​)

=e−2

σ2(x

i​−x

j​)2

​這使得離x

ix_i

xi​近的點對x

ix_i

xi​對應元集合的影響大,離x

ix_i

xi​遠的點影響小。對每乙個點x

ix_i

xi​都運用高斯核函式計算出乙個權重矩陣wi=

diag

(w1,

w2,.

..,w

m)w_i=diag(w_1,w_2,...,w_m)

wi​=di

ag(w

1​,w

2​,.

..,w

m​) ,此時對於每乙個樣本點都有乙個標準線性回歸方程,其代價函式為:

於是對於每個**值而言都有:

在**實現層面,下面貼出計算引數的核心**:

def lwlr_weights

(x_test,xmat,ymat,gama)

: #計算權重矩陣並返回theta

n = np.

shape

(xmat)[1

] weights = np.

eye(n)

temp = np.

multiply

(np.

diagonal

((xmat-x_test)

.t*(xmat-x_test)

).t,weights)

weights = np.

multiply

(np.

diagonal

(np.

exp(

-gama*temp)

).t,weights)

xwx = xmat*weights*xmat.tif

(np.linalg.

det(xwx)==0

):return

"\terror"

else

: theta = xwx.i*xmat*weights*ymat.

treturn theta

其中temp與weights的計算通過numpy庫中矩陣點乘、提取對角元素等操作避免了顯式的for迴圈。向量化是機器學習中非常重要的節約資源的手段,經驗證,本實驗200個資料採用矩陣運算只需0.7ms左右完成,而使用for迴圈則需要3.8ms左右,且此倍率將隨著樣本擴大而增加。

如圖2所示為回歸分析的結果,取gama=1,900,50000進行實驗。gama越大說明高斯核的作用越強,前述元集合越小,擬合程度越高。但過擬合和欠擬合均不具備機器學習提高泛化能力的初衷,因此在一般模型設計時還會對其正則化。

機器學習 區域性加權線性回歸

一 問題引入 我們現實生活中的很多資料不一定都能用線性模型描述。依然是房價問題,很明顯直線非但不能很好的擬合所有資料點,而且誤差非常大,但是一條類似二次函式的曲線卻能擬合地很好。為了解決非線性模型建立線性模型的問題,我們 乙個點的值時,選擇與這個點相近的點而不是所有的點做線性回歸。基於這個思想,便產...

機器學習 區域性加權線性回歸

線性回歸的乙個問題時又可能出現欠擬合現象,為了解決這個問題,我們可以採用乙個方法是區域性加權線性回歸 locally weighted linner regression 簡稱lwlr。該演算法的思想就是給帶 點附近的每乙個點賦予一定的權值,然後按照簡單線性回歸求解w的方法求解,與knn一樣,這種演...

機器學習 區域性加權線性回歸及Python實現

區域性加權回歸的權重計算公式 高斯核函式作為權重矩陣 下面是python 區域性加權回歸 lwlr 完整版 import numpy as np import os os.chdir machinelearning regression firstline open ex0.txt readline...