機器學習實戰 標準線性回歸和加權線性回歸演算法

2021-10-04 17:25:15 字數 3062 閱讀 7110

'''

機器學習實戰章8

乙個矩陣x(樣本資料屬性矩陣)和y(樣本資料y矩陣)可擬合出一條直線

標準線性回歸只擬合出一條直線,區域性加權線性回歸共更新x矩陣m-1次,在相鄰兩個資料之間都回歸出直線,共得到m-1條直線,連線起來就近似曲線了

改變lwlr()函式的k值,可以改變曲線的平滑度和擬合度,大家有興趣可以試試

本**使用的資源和檔案在文末

'''from numpy import *

''' 該函式解析用tab鍵分離的文字檔案,若該檔案內有m條資料

datamat:如其名,屬性矩陣,m x 2

labelmat:y值矩陣,m x 1

'''def loaddataset(filename):

numfeat = len(open(filename).readline().split('\t')) - 1 #獲取屬性數,前兩列是屬性,最後一列是y值

datamat = ; labelmat =

fr = open(filename)

for line in fr.readlines():

linearr =

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

for i in range(numfeat):

return datamat,labelmat #函式有多個返回值其實是返回了乙個tuple

"""標準回歸,計算最佳擬合直線

返回m x 1的回歸係數矩陣

"""def standregres(xarr,yarr):

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

xtx = xmat.t*xmat

if linalg.det(xtx) == 0.0:#判斷xtx矩陣行列式是否為0,linalg是numpy提供的線性代數庫

print( "this matrix is 不可逆的, cannot 求逆")

return

ws = xtx.i * (xmat.t*ymat)

return ws

'''加權區域性線性回歸

以待**資料為中心對所有樣本資料賦予一定的權重得到新x矩陣,相鄰兩點間回歸出直線,上述過程重複m-1次,連線在一起近似平滑的曲線

k是引數,由使用者指定,這也是lwlr中唯一要考慮的引數

testpoint: 1 * 2 一條測試資料,不是乙個點

weights:m * m

xmat: m * 2

ymat: m * 1

ws: 2 * 1

'''def lwlr(testpoint,xarr,yarr,k):

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

m = shape(xmat)[0] # m 樣本資料數

weights = mat(eye((m))) #eye()建立m階單位矩陣,是方陣,即該矩陣為每個樣本點初始化了乙個權重1

for j in range(m):

diffmat = testpoint - xmat[j,:] #樣本點與待遇測點的距離

#exp():以e為底的指數函式。隨著樣本點與待**點距離遞增,權重以指數級衰減。這種設定權重的方法叫高斯核型別。

weights[j,j] = exp(diffmat*diffmat.t/(-2.0*k**2))

xtx = xmat.t * (weights * xmat) # x = weights * xmat,相當於更新了x(樣本)矩陣

if linalg.det(xtx) == 0.0:

print( "this matrix cannot do inverse")

return

ws = xtx.i * (xmat.t * (weights * ymat)) #求sei ta的演算法式子也更新,得到回歸係數(sei ta)2 * 1

return testpoint * ws # 返回lwlr對testpoint(樣本資料)的**值

'''本函式對所有樣本資料呼叫lwlr(),得到所有**值

''' m = shape(testarr)[0]

yhat = zeros(m)

for i in range(m):

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

return yhat

"""xarr,yarr是陣列,loaddataset()的返回值

"""def show(xarr,yarr,yhat):

xmat = mat(xarr) # 陣列轉化成矩陣 m * 2

ymat = mat(yarr) # 陣列轉化成矩陣1 * m

#排序strind = xmat[:,1].argsort(0) #對樣本x公升序排序並返回索引

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

import matplotlib.pyplot as plt

fig = plt.figure()

ax = fig.add_subplot(111)

ax.plot(xsort[:,1],yhat[strind])# xsort是橫座標,yhat是對應的縱座標,plot按索引順序在相鄰兩點連線。如果不排序就會來回畫

ax.scatter(xmat[:,1].flatten().a[0],ymat.t.flatten().a[0],s = 2,c = 'red') # 畫出所有原始資料

plt.show()

xarr,yarr = loaddataset("ex0.txt")

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

show(xarr,yarr,yhat)

"""print(corrcoef(yhat.t,ymat))

corrcoef(yestimate,yactual):計算真實值和**值的相關性,兩個引數都應是行向量

輸出[[1. 0.98647356]

[0.98647356 1. ]]

表示相關性為0.98647356

"""

實現標準線性回歸

線性回歸是假設特證滿足線性關係,根據給定的訓練資料訓練乙個模型,即回歸方程,並用此模型進行 回歸 求回歸係數的過程。具體做法是用回歸係數乘以輸入值,將結果相加,得到 值。它是一種針對數值型資料的監督學習方法。適用於數值型,如果是標稱型或名義型的資料,需要轉為數值型資料 對於非線性資料擬合較差 資料集...

機器學習 區域性加權線性回歸

一 問題引入 我們現實生活中的很多資料不一定都能用線性模型描述。依然是房價問題,很明顯直線非但不能很好的擬合所有資料點,而且誤差非常大,但是一條類似二次函式的曲線卻能擬合地很好。為了解決非線性模型建立線性模型的問題,我們 乙個點的值時,選擇與這個點相近的點而不是所有的點做線性回歸。基於這個思想,便產...

機器學習 區域性加權線性回歸

線性回歸的乙個問題時又可能出現欠擬合現象,為了解決這個問題,我們可以採用乙個方法是區域性加權線性回歸 locally weighted linner regression 簡稱lwlr。該演算法的思想就是給帶 點附近的每乙個點賦予一定的權值,然後按照簡單線性回歸求解w的方法求解,與knn一樣,這種演...