回歸的目的是**數值型的目標值。即找到乙個回歸方程,通過求解其中的回歸係數(該過程就稱為回歸),給定輸入來得到**值。這裡我們之談論線性回歸。
用線性回歸找最佳擬合直線
回歸的一般方法:
收集資料;
準備資料;
分析資料:可以繪出資料的視覺化二維圖將有助於對資料做出理解和分析,在採用縮減法求得新回歸係數之後,可以將新擬合線繪在圖上作為對比
訓練演算法:找到回歸係數
測試演算法:使用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...