機器學習之線性回歸縮減維度

2021-10-01 08:38:56 字數 4222 閱讀 2714

參考文獻

如上圖 前面 我們求解線性回歸的時候 列舉的乙個例子。

這個例子中:

房子的面積, 房間的數量 , 樓間距, 離學校的距離 我們的資料 從這四個維度取例 ,也稱為資料的維度 用d表示。

下面的每一行 表示乙個 房子的樣本 。 樣本可以有n 多個。

當我們資料的維度 大於 樣本的數量的時候 我們稱為 維數膨脹

在分析高維資料過程中碰到最大的問題就是維數的膨脹,也就是通常所說的「維數災難」問題。研究表明,隨著維數的增長,分析所需的空間樣本數會呈指數增長

如下所示,當資料空間維度由1增加為3,最明顯的變化是其所需樣本增加;換言之,當樣本量確定時,樣本密度將會降低,從而樣本呈稀疏狀態。假設樣本量n=12,單個維度寬度為3,那在一維空間下,樣本密度為12/3=4,在二維空間下,樣本分佈空間大小為3*3,則樣本密度為12/9=1.33,在三維空間下樣本密度為12/27=0.44。

設想一下,當資料空間為更高維時,x=[x1x1,x2x2,….,xnxn]會怎麼樣?

1,需要更多的樣本,樣本隨著資料維度的增加呈指數型增長;

2,資料變得更稀疏,導致資料災難;

3,在高維資料空間,**將變得不再容易;

4, 導致模型過擬合。

這裡我們先學習 兩種 lasso ,前向逐步回歸法。

這篇文章詳細介紹了 嶺回歸

我們得出如下公式:

這個lamda 幫我們解決了 不是滿秩矩陣的問題。 但是 其中這個lamda 該取多少值呢 ?

因為 lamda 這個 因子的不確定性 所以得到權重也不太一樣 。

從這個圖中 我們可以發現 隨著 lamda 逐漸變大 ,權重中的 二維權重(x,y) y 值逐漸接近為 0 。

g(z)= w0x0 + 0x1那麼我們調節 lamda值 就可以 減少 乙個維度的資料 。 所以嶺回歸 不斷可以解決 滿秩矩陣的問題 ,還可以縮減 維度問題。

lasso 就是 對 上述的 權重 和 lamda 在做乙個限制 。

nς | wk| ≤ λ

k=1在λ 足夠小的時候 , 一些係數會因此被迫縮減到 0 。 這樣就可以減少 若干係數。

前向逐步回歸法 可以得到 跟lasso 差不多的效果。但是更加簡單。 它屬於 貪心演算法 。

上圖中的 增大 或者減少 這樣操作 。 比如 g(z) = w0* x0 +w1 * x1

讓w0 += 0.1 或者 w0 += -0.1 比較 哪個誤差更小 。 誰小 就取哪個 。 就跟盲人探路 是一回事。 盲人沒走一步 就探測一下 前面有坑沒有 沒有就往前走 ,否則就往後退 。

前向逐步回歸法**實現

#coding=utf-8

from numpy import

*import numpy as np

import matplotlib.pyplot as plt

filename=

'./ex1.txt'

#檔案目錄

defloaddataset

(filename)

: numfeat =

len(

open

(filename)

.readline(

).split(

'\t'))

-1datamat =

;labelsvec =

file

=open

(filename)

for line in

file

.readlines():

linearr =

curline = line.strip(

).split(

'\t'

)for i in

range

(numfeat)

:float

(curline[i]))

float

(curline[-1

]))return datamat,labelsvec

defrsserror

(yarr,yhatarr)

:#yarr and yhatarr both need to be arrays

return

((yarr-yhatarr)**2

).sum(

)def

stagewise

(xarr,yarr,eps=

0.01

,numit=10)

: xmat = mat(xarr)

; ymat=mat(yarr)

.t ymean = mean(ymat,0)

#ymat = ymat - ymean #can also regularize ys but will get smaller coef

#xmat = regularize(xmat)

m,n=shape(xmat)

returnmat = zeros(

(numit,n)

)#testing code remove

ws = zeros(

(n,1))

; wstest = ws.copy(

); wsmax = ws.copy(

)print

("wstest=="

,wstest)

for i in

range

(numit)

:print

( ws.t)

lowesterror = inf;

for j in

range

(n):

# 來回試探 看看 哪個適合

for sign in[-

1,1]

: wstest = ws.copy(

)print

("wstest[j]"

,wstest[j]

) wstest[j]

+= eps*sign

ytest = xmat*wstest

rsse = rsserror(ymat.a,ytest.a)

if rsse < lowesterror:

lowesterror = rsse

wsmax = wstest

ws = wsmax.copy(

) returnmat[i,:]

=ws.t

return returnmat

defplotline

(x,wmat)

:

fig = plt.figure(

) ax = fig.add_subplot(

111)

#number = 20

ax.plot(wmat)

print

("x"

,x)#ax.plot(mat(x).t[:,1],wmat.t[:,1])

plt.show(

)def

teststage()

: x,y= loaddataset(filename)

wmat=stagewise(x,y)

plotline(x,wmat)

teststage(

)

前向逐步回歸法 縮減引數

很多同學估計跟我一樣 演算法看明白了 但是 這個怎麼就縮減引數了呢? 非常感謝 我的老朋友唐國斌 給了我很大的啟發 。

比如特徵值有10個, w就有10個 ,逐步向前回歸就是直接把10個特徵值,減少成9個 w也變成9個 然後看減少後,比減少前是否好,如果好了,就減少,乙個個特徵值去試,看看直接刪除這個特徵值,會不會讓模型變得更好,有些特徵值,刪除反而比保留好,這個是因為這些值可能和其他幾個特徵值 差不多 就是資訊冗餘了

再次 感謝 老朋友 唐國斌

機器學習之線性回歸

訓練樣例 x y 輸入變數 特徵 x ps n 1行,1 列 輸出變數 目標變數 y訓練樣例總數 m 特徵維度 n第 i 個訓練樣例 x i y i 所有訓練樣例的輸入變數組成的矩陣 x ps m行,n 1 列,每行是 x i t 所有訓練樣例的輸出變數組成的矩陣 y ps m行,1 列 下表是某地...

機器學習之線性回歸

線性回歸就是用線性方程去擬合一組資料,x 的最高端是1,用方程可以表示為 h x 0 1x1 n xn我們令 x0 1則上式可以改寫為 h x i 0n ixi tx 既然是擬合的模型,則肯定會存在不符合該模型的點,第 i 個點的真實值與模型 的值之間的差稱為誤差 e h x i y i 假設總共有...

機器學習之線性回歸

線性回歸分析 regression analysis 其資料集是給定乙個函式和他的一些座標點,然後通過回歸分析的演算法,來估計原函式的模型,求得最符合這些資料集的函式解析式。然後我們就可以用來預估未知資料,輸入乙個自變數便會根據這個模型解析式輸出因變數,這些自變數就是特徵向量,因變數即為標籤,而且標...