回歸 最佳擬合直線與區域性線性回歸

2021-08-16 19:42:00 字數 4185 閱讀 6336

回歸可以做任何事,例如銷售量**或者製造缺陷**。

具體的做法是用回歸係數乘以輸入值,再將結果全部加在一起,就得到了**值。其中,求回歸係數的過程就是回歸,一旦有了回歸係數,再給定輸入,做**就很容易了。

1. 收集資料

2. 準備資料

3. 分析資料

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

5. 測試演算法:可使用**值和資料的擬合度,來分析模型的效果

6. 使用演算法:使用回歸,可在給定輸入的時候**出乙個數值

怎樣求出回歸方程?假設手裡有一些x和對應的y,怎樣才能找到回歸係數w呢?乙個常用的方法就是找出使**值和實際值誤差最小的w。這裡的誤差即**y值和實際y值之間的差值,即 y-wx ,但若使用該誤差的簡單累加將使得正差值和負差值相互抵消,所以在此我們採用平方誤差,計算所有點的平方誤差之和,即:

用矩陣表示還可以寫做:

如果對w求導,便可得到:

令其等於0,解出w如下:

(上述過程可由最小二乘法解出)

從現有資料上估計出的w可能並不是資料中的真是w值,w上方的小標記表示它僅是w的乙個最佳估計。

上述公式中包含求逆矩陣,因此此方程僅在逆矩陣存在時使用。逆矩陣可能並不存在,因此需要在**中做出判斷。

具體執行**如下:

1.匯入需要使用的庫:

from numpy import *

import numpy as np

2.讀取資料:

def loaddataset(filename):

numfeat = len(open(filename).readline().split('\t')) - 1

print(numfeat)

datamat = ; labelmat =

fr = open(filename)

for line in fr.readlines():

linearr =

curline = line.strip().split('\t')

for i in range(numfeat):

return datamat,labelmat

3.計算回歸係數:

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

4.依據回歸方程**資料值:

xmat = mat(xarr)

ymat = mat(yarr)

yhat = xmat * ws

5.計算相關係數,測試演算法:

yhat = xmat * ws

corrcoef(yhat.t,ymat)

6.用matplotlib繪出圖表:

import matplotlib.pyplot as plt

fig = plt.figure()

ax = fig.add_subplot(111)

ax.scatter(xmat[:,1].flatten().a[0],ymat.t[:,0].flatten().a[0])

xcopy = xmat.copy()

xcopy.sort(0)

yhat = xcopy * ws

ax.plot(xcopy[:,1],yhat)

plt.show()

7.最終輸出圖表:

至此,完整的最佳擬合直線線性回歸結束。

優點:計算簡單,結果易於理解

缺點:對非線性的資料擬合不好

適用資料型別:數值型和標稱型資料

因為線性回歸最佳擬合直線的方法求的是具有最小均方誤差的無偏估計,對於非線性資料,有可能出現欠擬合的現象,無法取得最好的**效果,因此,允許在估計中引入一些偏差,從而降低**的均方誤差。

其中乙個方法是區域性加權線性回歸,在該演算法中,我們給待**點附近的每個點賦予一定的權重,然後與最佳擬合直線回歸類似,在這個子集上基於最小均方差來進行普通的回歸。該演算法對應的回歸係數w的形式如下:

在此,我們使用核來對附近的點賦予更高的權重。核的型別可自由選擇,最常用的是高斯核,高斯核對應的權重如下:

這樣就構建了乙個權重矩陣w,並且點 x 與 x(i) 越近,w(i,i) 越大。上述公式包含了乙個需使用者指定的引數k,它決定了對附近 的點賦予多大的權重。若選取k值過大,則會導致欠擬合,k值過小則考慮了太多的雜訊,進而導致過擬合現象,在此案例中,我們選擇k=0.003。

具體的執行**只需在最佳擬合直線的基礎上改用新的方法去求回歸係數w,並且最終**資料值:

1.定義乙個函式,可求出回歸係數與輸入資料的積:

def lwlr(testpoint , xarr , yarr ,k = 1.0):

xmat = np.mat(xarr); ymat = np.mat(yarr).t

m = np.shape(xmat)[0]

weights = np.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

2.呼叫函式,**資料值:

def lwlrtest(testarr,xarr,yarr,k = 1.0):

m = np.shape(testarr)[0]

yhat = np.zeros(m)

for i in range(m):

yhat[i] = lwlr(testarr[i],xarr,yarr,k)

return yhat

3.呼叫函式,用matplotlib畫出圖表:

yhat = lwlrtest(xarr,xarr,yarr,0.003)

srtind = xmat[:,1].argsort(0)

xsort = xmat[srtind][:,0,:]

fig = plt.figure()

ax = fig.add_subplot(111)

ax.plot(xsort[:,1],yhat[srtind])

ax.scatter (xmat[:,1].flatten().a[0],np.mat(yarr).t.flatten().a[0],s=2,c='red')

plt.show()

4.最終輸出區域性加權回歸函式圖:

區域性加權線性回歸也存在乙個問題,即增加了計算量,因為它對每個點做**時都必須使用整個資料集。我們選取k=0.01可以得到很好的估計,但同時可以發現大多數資料點的權重都接近零。如果避免這些計算將可以減少程式執行時間,從而緩解因計算量增加帶來的問題。

線性回歸 4 欠擬合 過擬合與區域性加權線性回歸

的個 數或者x 的指數大 小來獲得 不同形狀 的擬合曲 線 看下面的圖 左邊的曲線是在假設y 0 1x時的擬合結果,但顯然中間的曲線要比左邊的擬合效果更好。我們稱左邊的情況為欠擬合 underfitting 這樣看來右邊的不是比左邊更好嗎?no!我們稱右邊的情況為過擬合 overfitting 因為...

區域性線性回歸

線性回歸就是對整個資料集進行訓練,就比如說擬合成一條直線,引數選擇所依據的標準就是 而區域性線性回歸是對要 的點的左右區域進行擬合,也就是根據它的周圍情況擬合成一條直線,而不是整個資料集。它是非引數學習方法,是因為不能確定引數的值,而是對於某個 求得一組引數。引數隨著要 的x變化而變化。它的loss...

區域性線性回歸

區域性加權緊接著上面的線性回歸中引數求解來繼續講吧。還是以上面的房屋 的 它的中心思想是在對引數進行求解的過程中,每個樣本對當前引數值的影響是有不一樣的權重的。比如上節中我們的回歸方程為 這個地方用矩陣的方法來表示 表示引數,i表示第i個樣本,h為在 引數下的 值 我們的目標是讓 最小,然後求出來 ...