機器學習算法學習---處理迴歸問題經常使用算法(一)

一、線性迴歸python

優勢:結果易於理解,計算上不復雜。算法

缺點:對非線性的數據擬合很差。app

適用數據:數值型、標稱型。函數

迴歸的目的是預測數值型的目標值。最直接的辦法是依據輸入寫出一個目標值的計算公式;這就是迴歸方程,其中的未知係數稱做迴歸係數,求這些迴歸係數的過程就是迴歸。
測試

線性迴歸意味着能夠將輸入項分別乘以一些常量,再將結果加起來獲得輸出。spa

Y=XTw如何求w,經常使用方法就是找出使偏差最小的w。.net

平方偏差能夠寫作:sum(yi-xiTw)2blog

用矩陣表示:(y-Xw)T(y-Xw),對w求導,獲得XT(Y-Xw),令其等於0,求解出w如:w'=(XTX)-1XTy。該方法也稱做OLS(普通最小二乘法)。ip

模型效果能夠經過計算預測值和真實值的相關係數來衡量,numpy庫的corrcoef(yEstimate,yActual)能夠計算;相關性越高,模型效果越好。get

代數求解:

 

第一:用所給樣本求出兩個相關變量的(算術)平均值:
x_=(x1+x2+x3+...+xn)/n
y_=(y1+y2+y3+...+yn)/n    

第二:分別計算分子和分母:(兩個公式任選其一)
分子=(x1y1+x2y2+x3y3+...+xnyn)-nx_Y_
分母=(x1^2+x2^2+x3^2+...+xn^2)-n*x_^2

第三:計算b:b=分子/分母

python實現:

 

 

普通最小二乘迴歸
from numpy import *
#數據導入
def loadDataSet(filename):
numFeat=len(open(filename).readline().split())-1
dataMat=[]
labelMat=[]
f=open(filename)
lines=f.readlines()
for line in lines:
temp=[]
line=line.strip().split()
for i in range(numFeat):
temp.append(float(line[i]))
dataMat.append(temp)
labelMat.append(float(line[-1]))
return dataMat,labelMat
#標準迴歸函數
def standRegres(xArr,yArr):
xMat=mat(xArr);yMat=mat(yArr).T
xTx=xMat.T*xMat
if linalg.det(xTx)==0.0:
print('This matrix is singular,cannot do inverse')
return
ws=xTx.I*(xMat.T*yMat)
return ws

 

二、局部加權線性迴歸

線性迴歸的問題:可能出現欠擬合現象;緣由:求的是具備最小均方偏差的無偏估計;解決:引入一些誤差。

LWLR算法:給待預測點附近的每一個點賦予必定的權重,而後在這個子集上基於最小均方差來進行普通的迴歸。

 

w'=( X T WX) -1 X T Wy,其中W是一個矩陣,用來給每一個數據點賦予權重。

LWLR使用「核」來對附近的點賦予更高的權重。最經常使用的核是高斯核,其對應權重以下:

w(i,i)=exp(|x(i)-x|/(-2k2)),其中x(i)是預測點,k是惟一考慮的參數,決定了對附近點賦予多大的權重。

若是k取值較大,和標準迴歸相似,可能出現欠擬合現象;若k取值較小,則可能出現過擬合現象。

 

局部線性迴歸的問題:增長了計算量(由於其對每一個點預測時都必須使用整個數據集)。

python實現:

 

局部加權線性迴歸
def lwlr(testPoint,xArr,yArr,k=1.0):
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))#權重值大小以指數級衰減
xTx=xMat.T*(weights*xMat)
if linalg.det(xTx)==0.0:
print('This matrix is singular,cannot do inverse')
return
ws=xTx.I*(xMat.T*(weights*yMat))
return testPoint*ws
def lwlrTest(testArr,xArr,yArr,k=1.0):
m=shape(testArr)[0]
yHat=zeros(m)
for i in range(m):
yHat[i]=lwlr(testArr[i],xArr,yArr,k)
return yHat

 

三、嶺迴歸

若是特徵比樣本點還多,用前面的方法不可行,由於輸入數據矩陣再也不是滿秩矩陣,求逆會出錯。

嶺迴歸就是在矩陣XTX上加一個λI從而使其非奇異,迴歸係數的計算公式變成:

 

w'=( X T X+ λI) -1 X Ty

嶺迴歸最早用於處理特徵數多於樣本數的狀況,如今也應用於在估計中加入誤差,從而獲得更好的估計。

經過引入λ來限制了全部w之和,經過引入該懲罰項,可以減小不重要的參數,該技術在統計學中也叫作縮減。

縮減方法能夠去掉不重要的參數,所以能更好地理解數據。此外,與簡單線性迴歸相比,縮減法能取得更好的預測效果。

λ很是小時,係數與普通迴歸同樣;而λ很是大時,全部迴歸係數縮減爲0;能夠在中間某處找到使得預測結果最好的λ值。

python實現:

 

 

嶺迴歸
def ridgeRegres(xMat,yMat,lam=0.2):
xTx=xMat.T*xMat
denom=xTx+eye(shape(xMat)[1])*lam
if linalg.det(denom)==0.0:
print('This matrix is singular,cannot do inverse')
return
ws=denom.I*(xMat.T*yMat)
return ws
def ridgeTest(xArr,yArr):
xMat=mat(xArr);yMat=mat(yArr).T
yMean = mean(yMat,0)
yMat=yMat - yMean
xMeans=mean(xMat,0)
xVar=var(xMat,0)
xMat=(xMat - xMeans)/xVar
numTestPts=30#30個不一樣的lambda值進行測試,選最優
wMat=zeros((numTestPts,shape(xMat)[1]))
for i in range(numTestPts):
ws=ridgeRegres(xMat,yMat,exp(i-10))
wMat[i,:]=ws.T
return wMat

 

四、lasso(另外一個縮減方法)

在增長以下約束時,普通的最小二乘法迴歸會獲得與嶺迴歸的同樣的公式。

sum(wk2)<=λ

lasso方法也對迴歸係數作了限定,對應的約束條件以下:

sum(|wk|)<=λ

這個約束條件使用絕對值取代平方和。在λ足夠小的時候,一些係數會所以被迫縮減到0,這個特性能夠幫助咱們更好地理解數據。

缺點:計算複雜。

五、前向逐步迴歸

效果與lasso方法差很少,但更加簡單,屬於一種貪心算法,即每一步都儘量減小偏差。(一開始,全部權重設爲1,而後每一步所作的決策是對某個權重增長或減小一個很小的值。)

python實現:

 

前向逐步迴歸
#偏差
def rssError(yArr,yHatArr):
return ((yArr - yHatArr)**2).sum()
def stageWise(xArr,yArr,eps=0.01,numIt=100):#eps表示每次迭代須要調整的步長;numIt表示迭代次數
xMat=mat(xArr);yMat=mat(yArr).T
yMean=mean(yMat,0)
yMat=yMat - yMean
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 rssE<lowestError:
lowestError=rssE
wsMax=wsTest
ws=wsMax.copy()
returnMat[i,:]=ws.T
return returnMat

 

 

六、權衡誤差與方差

https://blog.csdn.net/qq_30490125/article/details/52401773 

相關文章
相關標籤/搜索