如果資料的特徵比樣本點還多應該怎麼辦?是否還可以使用線性回歸?答案是否定的。多元線性回歸的演算法,需要輸入資料的矩陣是滿秩矩陣。如果特徵比樣本點多,則說明輸入矩陣不是滿秩矩陣。
為了解決以上問題,我們可以引入「嶺回歸」,「lasso法」,「前向逐步回歸」三種縮減方法。
縮減:通過引入懲罰項,減少不重要的引數,這個技術在統計學中叫做縮減。
嶺回歸就是在矩陣xtx
x^tx
xtx上加上乙個λ
i\lambda i
λi從而使得矩陣非奇異,進而能對xtx
+λ
ix^tx+\lambda i
xtx+λi
求逆。其中矩陣i
ii是乙個mxm的單位矩陣,對角線上元素全為1,其他元素全為0。而λ
\lambda
λ是乙個使用者定義的數值。回歸係數的計算公式將變成:
w ^=
(xtx
+λi)
−1xt
y\hat = (x^tx+\lambda i)^x^ty
w^=(xt
x+λi
)−1x
ty演算法思想
嶺回歸通過**誤差最小化得到λ
\lambda
λ:獲取資料後首先抽取一部分資料作為測試集,剩下資料作為訓練集用於訓練引數w
ww訓練完畢後在測試集上測試**效能
選取不同的λ
\lambda
λ重複上述的過程,最終得到乙個使**誤差最小的λ
\lambda
λ對嶺回歸**的實現:
def
ridgeregress
(xmat, ymat, lam =
0.2)
: xtx = xmat.t * xmat
denom = xtx + eye(
int(shape(xmat)[1
]))* lam
if linalg.det(denom)==0
:return
ws = denom.i *
(xmat.t * ymat)
return ws
通過矩陣返回檢視λ
\lambda
λ對嶺回歸結果的影響,以便獲取合適的懲罰值:
def
ridgetest
(xarr, yarr)
: xmat2 = mat(xarr)
; ymat2 = mat(yarr)
.t ymean2 = mean(ymat2,0)
ymat2 = ymat2 - ymean2
xmeans = mean(xmat2,0)
xvar = var(xmat2,0)
xmat2=
(xmat2 - xmeans)
/xvar
numtestpts =
30 wmat = zeros(
(numtestpts,
int(shape(xmat2)[1
])))
for i in
range
(numtestpts)
: ws = ridgeregress(xmat2, ymat2, exp(i-10)
) wmat[i,:]
= ws.t
return wmat
前向逐步回歸演算法屬於貪心演算法,每一步都盡可能減少誤差。一開始,所有的權重都設為1,然後每一步所做的決策對某個權重增加或減少乙個很小的值。
偽**實現:
資料標準化,使其分布滿足0均值和單位方差
在每輪迭代過程中:
設定當前最小誤差lowesterror為正無窮
對每個特徵:
增大或縮小:
改變乙個係數得到乙個新的w
ww計算新w
ww下的誤差
如果誤差error小於當前最小誤差lowesterror:設定wbest等於當前的w
ww將w
ww設定為新的wbest
def
rsserror
(yarr,yhatarr)
:#yarr and yhatarr both need to be arrays
return
((yarr-yhatarr)**2
).sum(
)def
regularize
(xmat)
:#regularize by columns
inmat = xmat.copy(
) inmeans = mean(inmat,0)
#calc mean then subtract it off
invar = var(inmat,0)
#calc variance of xi then divide by it
inmat =
(inmat - inmeans)
/invar
return inmat
defstagewise
(xarr, yarr, eps =
0.01
, numit =
100)
: xmat = mat(xarr)
; ymat = mat(yarr)
.t ymean = mean(ymat,0)
ymat = ymat - ymean
xmat = regularize(xmat)
m, n = shape(xmat)
ws = zeros(
(n,1))
; wstest = ws.copy(
); wsmax = ws.copy(
)for i in
range
(numit)
:print ws.t
lowesterror = inf;
for j in
range
(n):
for sign in[-
1,1]
: wstest = ws.copy(
) wstest[j]
+= eps*sign
ytest = xmat * wstest
rsse = rsserror(ymat.a, ytest.a)
if rsse < lowesterror:
lowesterror = rsse
wsmax = wstest
ws = wsmax.coy(
)
**分析:
1.資料輸入:xarr(輸入資料), yarr(**變數), eps(每次迭代需要調整的步長),numit(迭代次數)
2.首先將輸入資料轉換並存入矩陣,然後把特徵按照均值為0 方差為1進行標準化處理
3.建立乙個ws來儲存w
ww值,為了實現貪心演算法建立ws的兩份副本
4.通過迭代numit次優化過程,並且每次迭代都列印出w
ww向量,用於分析演算法執行的過程和效果
通過使用平方誤差,由函式rsserror()得到。該誤差初始值設為正無窮,經過所有的誤差比較後取最小的誤差。
機器學習 線性回歸
可以說基本上是機器學習中最簡單的模型了,但是實際上其地位很重要 計算簡單 效果不錯,在很多其他演算法中也可以看到用lr作為一部分 先來看乙個小例子,給乙個 線性回歸是什麼 的概念。圖來自 2 假設有乙個房屋銷售的資料如下 面積 m 2 銷售價錢 萬元 123 250 150 320 87 160 1...
機器學習(線性回歸)
在機器學習中,回歸 分類和標註共同構成了監督學習技術。監督學習 supervised learning 是機器學習在工業界應用最廣的乙個領域分支。在學術界中也是研究最多的領域之一。大家都知道的資料探勘十大經典演算法中,監督學習技術佔據6席。方法 自變數 特徵 因變數 結果 關係 回歸演算法是試圖採用...
機器學習 線性回歸
line fitter linearregression 建立模型 line fitter.fit temperature,sales 傳入引數 sales predict line fitter.predict temperature 模型 直線 直線上會有loss 計算loss時 要使用平方距離...