R語言——嶺迴歸的二次正則化項

今天可以接著前天的話題繼續寫了

R語言——嶺迴歸的二次正則化項

在完成了使用現成函數lm.ridge做出的嶺迴歸之後,來嘗試下整理這個東西的內部邏輯

本來想直接使用之前已經完成的結果來做後續對照的,但在指定optim函數的初始變量時發現一個很內傷的問題,那就是整個係數組中的常數值偏離太大,導致有限次數內總是收斂不到最佳解,不得已只能祭出大招,把所有數據先做一遍z-score標準化

以下是前期準備步驟,包括了導入數據,標準化,和使用兩個現成的函數產生的線性迴歸係數

代碼部分:

#導入數據
Data str(Data)
#z-score標準化
Z.score (x - mean(x))/sd(x) }
Data1 #一般線性擬合
LR1 #嶺迴歸,預先指定了參數lambda = 0.065
library("MASS")
LR2

輸出結果:

R語言——嶺迴歸的二次正則化項

就知道標準化能有點用處,至少這樣就可以先把所有初始輸入值設成0了

之前研究一般的線性迴歸時,咱用過optim函數最小化殘差平方和,也就是最通俗的最小二乘法,形式是這樣的:

#最小二乘法
Array.x SMQ CanCha SQCanCha return(SQCanCha) }
CoefOrgin Op1

運行結果和上邊已經做出來的LR1比較,稍微有一點差異,但所幸不至於差得坍臺

R語言——嶺迴歸的二次正則化項

而嶺迴歸作為線性迴歸的一種衍生算法,其最重要的部分是在最小二乘法的過程中增加了一個部分,參數lambda乘以二次正則化項

那啥叫正則化項呢?我就按上面代碼裡的部分來解釋吧,請稍稍仔細觀察下做最小二乘法時的代碼結構,裡面為了計算出殘差平方和至少用到了三個部分

目標列實際值(Data1$ValueSold)、自變量矩陣(Array.x)和係數向量x

就是這兩行:

CanCha SQCanCha 

而正則化項以本人粗劣的表達方式來講,就是上邊那個係數向量x的和

二次正則化項,為所有係數x的平方加和

所以,把一個普通的線性迴歸,改編成一個自帶流星雨特效的嶺迴歸的要點就是——在SQCancha那句話里加一截

SQCR 

由於廢話囉嗦了太多導致沒精神再多捯飭一段取最佳lambda的算法,所以這裡還是使用和上邊自動版一樣的參數0.065

#嶺迴歸手動不完全版
Array.x Ridge CanCha SQCR return(SQCR) }
CoefOrgin Op2

結果如下:

R語言——嶺迴歸的二次正則化項

驗證下來雖然依舊有點跑偏,但能咋辦咧,當然是原諒它啊,不然這麼糾結下去我還睡不睡覺了

至於在嶺迴歸的各種不同版本的介紹裡津津樂道的一個問題,為啥要取正則化項的二次,雖然比較官方的解釋是請直接聯想初中數學中的y=x2的曲線特徵,但我還是得說,這個世界是很大滴,其實在這位置加一次方的版本也有(Lasso),一次二次都加上的版本也有(彈性網絡),只不過每換種加法,算法就換了個名字,這我就不延伸出去了

------------------End----------------


分享到:


相關文章: