參考文獻
如上圖 前面 我們求解線性回歸的時候 列舉的乙個例子。
這個例子中:
房子的面積, 房間的數量 , 樓間距, 離學校的距離 我們的資料 從這四個維度取例 ,也稱為資料的維度 用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 其資料集是給定乙個函式和他的一些座標點,然後通過回歸分析的演算法,來估計原函式的模型,求得最符合這些資料集的函式解析式。然後我們就可以用來預估未知資料,輸入乙個自變數便會根據這個模型解析式輸出因變數,這些自變數就是特徵向量,因變數即為標籤,而且標...