機器學習實戰筆記 回歸

2021-08-20 12:32:41 字數 3964 閱讀 1048

回歸的目的是**數值型的目標值。即找到乙個回歸方程,通過求解其中的回歸係數(該過程就稱為回歸),給定輸入來得到**值這裡我們之談論線性回歸。

用線性回歸找最佳擬合直線

回歸的一般方法:

收集資料;

準備資料;

分析資料:可以繪出資料的視覺化二維圖將有助於對資料做出理解和分析,在採用縮減法求得新回歸係數之後,可以將新擬合線繪在圖上作為對比

訓練演算法:找到回歸係數

測試演算法:使用r^2或者**值和資料的擬合度,來分析模型的效果

使用演算法;

from numpy import*

"""資料匯入函式"""

def loaddataset(filename):

numfeat=len(open(filename).readline().split('\t'))-1 #特徵數包括了x0

datamat= #資料矩陣(其實是包括了x0的x矩陣)

labelmat= #標籤矩陣

fr=open(filename)

for line in fr.readlines():

linearr=

curline=line.strip().split('\t') #每一行是乙個樣本的資料x0,x1,y.注意x0恒為1,實際上是人為加在b前面的,用於方便矩陣運算

for i in range(numfeat):

return datamat,labelmat #返回x,y

"""標準線性回歸函式"""

def standregres(xarr,yarr):

xmat=mat(xarr)

ymat=mat(yarr).t

xtx=xmat.t*xmat #計算 x^t*x

if (linalg.det(xtx)==0.0): #linalg模組包含線性代數的函式 det用於計算矩陣的行列式

print("該矩陣是奇異的,沒有逆矩陣")

return

ws=xtx.i*(xmat.t*ymat) #計算w=(x^t*x)^-1*x^ty

return ws

區域性加權線性回歸

線性回歸的乙個問題是有可能出現欠擬合現象,因為它求的是具有最小均方差的無偏估計。所有有些方法允許在估計中引入一些偏差,從而降低**的均方誤差。區域性加權線性回歸就是其中的乙個方法。該演算法中,我們給待**點附近的每個點賦予一定的權重,然後在這個子集上基於最小均方差來進行普通的回歸。這種演算法每次**均需要事先選取出對應的資料子集。

該演算法解出的回歸係數w形式如下:

w=(x^t*w*x)^-1*x^twy

其中w是矩陣,用來給每個資料點賦予權重。

區域性加權線性回歸使用「核」來對附近的點賦予更高的權重,一般的是使用高斯核。高斯核對應的權重如下:

w(i,i)=exp(|x(i)-x|/-2k^2)

這樣就構建了乙個只含對角元素的權重矩陣w,並且點x與x(i)越近,w(i,i)將會越大。k由使用者指定,它決定了對附近的點賦予多大的權重。

def lwlr(testpoint,xarr,yarr,k=1.0):   #testpoint為待**點

xmat=mat(xarr)

ymat=mat(yarr).t

m=shape(xmat)[0]

weights=mat(eye((m))) #建立對角陣

for j in range(m):

diffmat=testpoint-xmat[j,:]

weights[j,j]=exp(diffmat*diffmat.t/(-2.0*k**2)) #隨著樣本點與待**點距離的遞增,權重將以指數級衰減,k用於控制衰減速度

xtx=xmat.t*(weights*xmat)

if linalg.det(xtx)==0.0:

print("該矩陣是奇異矩陣,沒有逆矩陣")

return

ws=xtx.i*(xmat.t*(weights*ymat)) #計算係數

return testpoint*ws #返回**值

縮減係數來「理解」資料

如果資料的特徵比樣本點還多(n>m),也就是說輸入資料的矩陣x不是滿秩矩陣,那麼x是不能求逆矩陣的。為了解決這個問題,引入領回歸和向前逐步回歸。

嶺回歸

簡單的說嶺回歸就是在矩陣x^t*x上加乙個λe,使得矩陣可逆。e是m*m的單位陣。這種情況下,回歸係數的計算公式變成:

w=(x^t*x+λe)^-1*x^t*y

嶺回歸最先用於處理特徵數多餘樣本數的情況,現在也用於在估計中加入偏差,從而得到更好的估計。這裡通過引入λ來限制了所有w之和,通過引入該懲罰項,能夠減少不重要的引數,統計上稱為縮減。

"""嶺回歸"""

def ridgeregres(xmat,ymat,lam=0.2):

xtx=xmat.t*xmat

denom=xtx+eye(shape(xmat)[1])*lam #x^t*x+λe

if linalg.det(denom)==0.0:

print("該矩陣是奇異矩陣,沒有逆矩陣")

return

ws=denom.i*(xmat.t*ymat)

return ws #返回w

前向逐步回歸

屬於一種貪心演算法,即每一步都盡可能減少誤差。一開始,所有的權重都設為1,然後每一步所做的決策是對某個權重增加或者減少乙個很小的值。

偽**如下:

資料標準化,使其分布滿足0均值和單位方差

在每輪迭代過程中:

設定當前最小誤差lowesterror為正無窮

對每個特徵:

增大或者縮小:

改變乙個係數得到乙個新的w

計算新w下的誤差

如果誤差error小於當前最小誤差lowesterror:

設定wbest等於當前的w

將w設定為新的wbest

"""前向逐步線性回歸"""

def stagewise(xarr,yarr,eps=0.01,numit=100): #eps表示每次迭代需要調整的步長,numit表示迭代次數

xmat=mat(xarr)

ymat=mat(yarr).t

ymean=mean(ymat,0) #mean()求取均值:0壓縮行,對各列求均值,返回 1* n 矩陣;1縮列,對各行求均值,返回 m *1 矩陣

ymat=ymat-ymean #0均值,即每個資料減去均值

xmat=regularize(xmat) #矩陣標準化

m,n=shape(xmat)

returnmat=zeros((numit,n))

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 rsselowesterror=rsse

wsmax=wstest

ws=wsmax.copy()

returnmat[i,:]=ws.t

機器學習實戰筆記 Logistic回歸

這裡我們會提到sigmoid函式,而且這個函式 梯度上公升法和梯度下降法 就像是神經網路的乙個神經元 個人這麼看而已 也像二極體的0.7v電壓,這裡面會提到梯度下降法,也會了解資料中缺失的處理。logistics回歸會讓我們接觸最優化演算法。其實我們生活中這樣的問題很多,例如如何在最短時間內從a地到...

線性回歸 機器學習實戰筆記

前言 剛開始看到線性回歸,總覺得這是不是和羅輯回歸又啥關係。對比一下吧。線性回歸用於數值 羅輯回歸用於分類。對於羅輯回歸 來說,用於分類的神經網路的最後一層也是乙個羅輯回歸。線性回歸 線性回歸比較簡單,找到一條最佳直線來擬合資料。擬合的目標可以是均方誤差最小。求最優的線性回歸直線的解法就是使用最小二...

機器學習實戰 Logistic回歸

11 e z 1 1 e zz w 0x0 w1x1 w2x 2 wn xxz w 0x0 w1x1 w2x 2 wn xx z wt x z w tx 在每個特徵上都乘以乙個回歸係數,然後把所有結果值相加,將這個總和代入sigmoid函式中,進而得到乙個範圍在0 1直接的數值。1類 大於0.5 0...