今天可以接著前天的話題繼續寫了
在完成了使用現成函數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
輸出結果:
就知道標準化能有點用處,至少這樣就可以先把所有初始輸入值設成0了
之前研究一般的線性迴歸時,咱用過optim函數最小化殘差平方和,也就是最通俗的最小二乘法,形式是這樣的:
#最小二乘法
Array.x SMQ CanCha SQCanCha return(SQCanCha) }
CoefOrgin Op1
運行結果和上邊已經做出來的LR1比較,稍微有一點差異,但所幸不至於差得坍臺
而嶺迴歸作為線性迴歸的一種衍生算法,其最重要的部分是在最小二乘法的過程中增加了一個部分,參數lambda乘以二次正則化項
那啥叫正則化項呢?我就按上面代碼裡的部分來解釋吧,請稍稍仔細觀察下做最小二乘法時的代碼結構,裡面為了計算出殘差平方和至少用到了三個部分
目標列實際值(Data1$ValueSold)、自變量矩陣(Array.x)和係數向量x
就是這兩行:
CanCha SQCanCha
而正則化項以本人粗劣的表達方式來講,就是上邊那個係數向量x的和
二次正則化項,為所有係數x的平方加和
所以,把一個普通的線性迴歸,改編成一個自帶流星雨特效的嶺迴歸的要點就是——在SQCancha那句話里加一截
SQCR
由於廢話囉嗦了太多導致沒精神再多捯飭一段取最佳lambda的算法,所以這裡還是使用和上邊自動版一樣的參數0.065
#嶺迴歸手動不完全版
Array.x Ridge CanCha SQCR return(SQCR) }
CoefOrgin Op2
結果如下:
驗證下來雖然依舊有點跑偏,但能咋辦咧,當然是原諒它啊,不然這麼糾結下去我還睡不睡覺了
至於在嶺迴歸的各種不同版本的介紹裡津津樂道的一個問題,為啥要取正則化項的二次,雖然比較官方的解釋是請直接聯想初中數學中的y=x2的曲線特徵,但我還是得說,這個世界是很大滴,其實在這位置加一次方的版本也有(Lasso),一次二次都加上的版本也有(彈性網絡),只不過每換種加法,算法就換了個名字,這我就不延伸出去了
------------------End----------------
閱讀更多 jennifer5jl 的文章