機器學習-線性迴歸

線性迴歸

簡介:之前的文章中介紹過一種迴歸算法,梯度下降算法,這裏再看看另外一個迴歸算法,線性迴歸,主要的內容包括簡單的線性迴歸和局部加權迴歸算法。

在迴歸裏面需要考慮的問題就是,我如何通過一堆訓練數據求出迴歸方程?例如通過房間的面積,體積,地理位置等信息預測房間的售價。在訓練數據中 面積、體積、地理位置我們統稱爲特徵值使用X 表示通常情況下X 都爲一個矩陣,最終房間的售價Y 。針對預測結果中的某條數據X1 預測結果將會通過y1=XT1w 計算得到,這裏的w 叫回歸係數,通過訓練數據我們需要找出誤差(得到的w 使得測試y和真實y之前的差值)最小的w ,一種簡單有效的方式是採用平方差:

i=1m(yixTiw)2(1)
對w求導,得到XT(yXw) ,令其等於零,得到 w=(XTX)1XTy

簡單的線性迴歸

通過上面的推導得到的公式 w=(XTX)1XTy ,我們便能通過代碼實現從訓練集合中找到最優的迴歸係數w。
具體算法:

from numpy import *

#xArr 爲 m x n 的一個數組
#yArr 爲 1 x m 的一個數組
def standRegres(xArr, yArr):
    xMat = mat(xArr); yMat = mat(yArr).T
    xTx = xMat.T * xMat
    if linalg.det(xTx) == 0.0 : ##說明xTx不可逆
        return
    ws = xTx.I * (xMat.T * yMat)

    return ws

局部加權線性迴歸

上述的線性迴歸方法的一個問題是可能會出現欠擬合現象,它求的是最小誤差的估計,針對的是全局最小誤差,如果說模型本身就是一個欠擬合模型則不能通過上述方法取得最好的預測效果。爲了解決這個問題引出了局部加權線性迴歸,在這個算法中我們給待預測點附近的每個點賦予一定的權重值,然後再選出的附近子集的基礎上採用最小方差進行迴歸 w=(XTWX)1XTWy 這裏面的W爲每個點權重,是一個矩陣,W的計算公式可以自由選擇,但是常見的使用高斯函數 W(i,i)=exp(|x(i)x|2k2) ,k爲用戶指定的的參數,k決定了給附近點賦予多大的權重,當k值越小那麼鄰近的點擁有越大的權重,而越遠的點權重比越小。
算法實現

def lwlr(testPoint, xArr, yArr, k=1.0):
    xMat = mat(xArr); yMat = mat(yArr).T
    m = shape(xMat)[0]
    ##構造一個對角矩陣
    weights = mat(eys((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:
        return 

    ws = xTx.I * (xMat.T * (weights * yMat))

    return testPoint * ws

局部加權需要通過不斷調整k值,是預測結果儘量準確,不同的k值對預測結果影響很大,另外通過上面的算法實現可以看出局部加權線性迴歸存在一個問題即,在每次預測目標值時都需要回歸整個訓練數據集,所以計算量很大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章