第二十一章 regression演算法——線性回歸&局部加權回歸演算法(上)

理論部分

回歸是統計學中最有力的工具之一。監督學習演算法分為分類演算法和回歸演算法兩種,其實就是根據類別標籤分布類型為離散型、連續性而定義的。顧名思義,分類演算法用於離散型分布預測,如KNN、決策樹、樸素貝葉斯、adaboost、SVM、Logistic回歸都是分類演算法;回歸演算法用於連續型分布預測,針對的是數值型的樣本,使用回歸,可以在給定輸入的時候預測出一個數值,這是對分類方法的提升,因為這樣可以預測連續型數據而不僅僅是離散的類別標籤。

回歸的目的就是建立一個回歸方程用來預測目標值,回歸的求解就是求這個回歸方程的回歸係數。預測的方法當然十分簡單,回歸係數乘以輸入值再全部相加就得到了預測值。

1,回歸的定義

回歸最簡單的定義是,給出一個點集D,用一個函數去擬合這個點集,並且使得點集與擬合函數間的誤差最小,如果這個函數曲線是一條直線,那就被稱為線性回歸,如果曲線是一條二次曲線,就被稱為二次回歸。

2,多元線性回歸

假定預測值與樣本特徵間的函數關係是線性的,回歸分析的任務,就在於根據樣本X和Y的觀察值,去估計函數h,尋求變數之間近似的函數關係。定義:

其中,n = 特徵數目;

xj = 每個訓練樣本第j個特徵的值,可以認為是特徵向量中的第j個值。

為了方便,記x0= 1,則多變數線性回歸可以記為:

,(θ、x都表示(n+1,1)維列向量)

3,廣義線性回歸

用廣義的線性函數

wj是係數,w就是這個係數組成的向量,它影響著不同維度的Φj(x)在回歸函數中的影響度,Φ(x)是可以換成不同的函數,這樣的模型我們認為是廣義線性模型,Φ(x)=x時就是多元線性回歸模型。

線性回歸的求解

說到回歸,常常指的也就是線性回歸。假設有連續型值標籤(標籤值分布為Y)的樣本,有X={x1,x2,...,xn}個特徵,回歸就是求解回歸係數θ=θ0, θ1,…,θn。那麼,手裡有一些X和對應的Y,怎樣才能找到θ呢? 在回歸方程里,求得特徵對應的最佳回歸係數的方法是最小化誤差的平方和。這裡的誤差是指預測y值和真實y值之間的差值,使用該誤差的簡單累加將使得正差值和負差值相互抵消,所以採用平方誤差(最小二乘法)。平方誤差可以寫做:

在數學上,求解過程就轉化為求一組θ值使求上式取到最小值,那麼求解方法有梯度下降法、Normal Equation等等。梯度下降有如下特點:需要預先選定步長a、需要多次迭代、特徵值需要Scaling(統一到同一個尺度範圍)。因此比較複雜,還有一種不需要迭代的求解方式--Normal Equation,簡單、方便、不需要Feature Scaling。Normal Equation方法中需要計算X的轉置與逆矩陣,計算量很大,因此特徵個數多時計算會很慢,只適用於特徵個數小於100000時使用;當特徵數量大於100000時使用梯度法。另外,當X不可逆時就有嶺回歸演算法的用武之地了。

下面就概括一下常用的幾種求解演算法。

1,梯度下降法(Gradient Descent)

根據平方誤差,定義該線性回歸模型的損耗函數(Cost Function)為:

,(係數是為了方便求導展示,此處的係數也可以只是1/2,沒有m。)

線性回歸的損耗函數的值與回歸係數θ的關係是碗狀的,只有一個最小點。

2,Normal Equation(也叫普通最小二乘法)

Normal Equation演算法也叫做普通最小二乘法(ordinary least squares),其特點是:給定輸人矩陣X,如果XTX的逆存在並可以求得的話,就可以直接採用該方法求解。其求解理論也十分簡單:既然是是求最小誤差平方和,另其導數為0即可得出回歸係數。

矩陣X為(m,n+1)矩陣(m表示樣本數、n表示一個樣本的特徵數),y為(m,1)列向量。

上述公式中包含XTX, 也就是需要對矩陣求逆,因此這個方程只在逆矩陣存在的時候適用。然而,矩陣的逆可能並不存在,後面會討論處理方法。

3,局部加權線性回歸

線性回歸的一個問題是有可能出現欠擬合現象,因為它求的是具有最小均方誤差的無偏估計。顯而易見,如果模型欠擬合將不能取得最好的預測效果。所以有些方法允許在估計中引人一些偏差,從而降低預測的均方誤差。其中的一個方法是局部加權線性回歸(LocallyWeightedLinearRegression, LWLR )。在該演算法中,我們給待預測點附近的每個點賦予一定的權重.於是公式變為:

,W是(m,m)矩陣,m表示樣本數。

LWLR使用 「核」(與支持向量機中的核類似)來對附近的點賦予更高的權重。核的類型可以自由選擇,最常用的核就是高斯核,高斯核對應的權重如下:

,k需要優化選擇.

局部加權線性回歸也存在一個問題,即增加了計算量,因為它對每個點做預測時都必須使用整個數據集,而不是計算出回歸係數得到回歸方程後代入計算即可。因此該演算法不被推薦。

標準回歸與局部加權回歸python2實現

from numpy import *#該函數打開一個用tab鍵分割的文本文件def loadDataSet(fileName): #general function to parse tab -delimited floats numFeat = len(open(fileName).readline().split( )) - 1 #get number of fields dataMat = []; labelMat = [] fr = open(fileName) for line in fr.readlines(): lineArr =[] curLine = line.strip().split( ) for i in range(numFeat): lineArr.append(float(curLine[i])) dataMat.append(lineArr) labelMat.append(float(curLine[-1])) return dataMat,labelMatdef standRegres(xArr,yArr):#該函數用來計算最佳擬合直線 xMat = mat(xArr); yMat = mat(yArr).T#讀入x和y並將它們保存到矩陣中 xTx = xMat.T*xMat if linalg.det(xTx) == 0.0:#判斷行列式是否為0,直接調用numpy的linalg線性代數的庫來計算行列式 print "This matrix is singular, cannot do inverse" return ws = xTx.I * (xMat.T*yMat)#行列式非0,計算係數並返回 return wsdef 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): #next 2 lines create weights matrix遍曆數據集 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 * wsdef lwlrTest(testArr,xArr,yArr,k=1.0): #loops over all the data points and applies lwlr to each one m = shape(testArr)[0] yHat = zeros(m) for i in range(m): yHat[i] = lwlr(testArr[i],xArr,yArr,k)#lwlrtest函數主要用於調用lwlr函數 return yHatdef lwlrTestPlot(xArr,yArr,k=1.0): #same thing as lwlrTest except it sorts X first yHat = zeros(shape(yArr)) #easier for plotting xCopy = mat(xArr) xCopy.sort(0) for i in range(shape(xArr)[0]): yHat[i] = lwlr(xCopy[i],xArr,yArr,k) return yHat,xCopy if __name__=="__main__": dataMat,labelMat=loadDataSet(C:UsersHZFDesktopmachinelearninginactionCh08ex0.txt) #print (mat(dataMat[0:2]))[:,1] #print (mat(labelMat[0:2])).T[:,0] import matplotlib.pyplot as plt#導入matplotlib庫用於畫散點圖進行比較 fig=plt.figure() ax=fig.add_subplot(111)#add_subplot(111)函數也可寫成add_subplot(1,1,1),意思是將畫布分布在1行1列從左到右從上到下的第一個模塊 ws=standRegres(dataMat,labelMat)#計算係數向量 #print ws yHat=(mat(dataMat))*ws#計算最優回歸值 #以下代碼是標準線性回歸的散點圖與最佳擬合的圖像 #ax.scatter((mat(dataMat))[:,1].flatten().A[0],(mat(labelMat)).T[:,0].flatten().A[0])#數據集散點圖 #xCopy=(mat(dataMat)).copy() #xCopy.sort(0)#對點按照升序排序 #yHat=xCopy*ws#畫最佳擬合直線 #ax.plot(xCopy[:,1],yHat) #plt.show() pc=corrcoef(yHat.T,labelMat)#計算yHat與labelMat的相關係數,即相關矩陣 #print pc #ws=lwlr(dataMat[0],dataMat,labelMat,k=1.0) yHat=lwlrTest(dataMat,dataMat,labelMat,0.02) print yHat #以下代碼是局部線性回歸的散點圖與最佳擬合的圖像 srtInd=(mat(dataMat))[:,1].argsort(0) xSort=(mat(dataMat))[srtInd][:,0,:] ax.plot(xSort[:,1],yHat[srtInd]) ax.scatter((mat(dataMat))[:,1].flatten().A[0],(mat(labelMat)).T.flatten().A[0],s=2,c=red) plt.show()

以上就是標準回歸(線性回歸)與局部加權回歸演算法的理論與python2實現過程(主要是針對最小二乘與局部加權的實現),會儘快補充這兩種演算法的應用與其他回歸演算法!

參考文獻

1、 機器學習經典演算法詳解及Python實現--線性回歸(Linear Regression)演算法

2、《機器學習實戰》(書)


推薦閱讀:

機器學習之Kaggle實戰:泰坦尼克號生存預測
Kaggle Titanic Data Analysis(Top 1.6%)經驗分享
了解一點模型部署與上線
構建lending club的申請評分卡模型
手把手教你使用ggplot2繪製折線圖

TAG:演算法 | 數據挖掘 | 回歸分析 |