開啟pycharm建立乙個regression.py檔案,輸入如下**:
#coding:utf-8
from numpy import *
seterr(divide='ignore',invalid='ignore')
"""------------------------普通線性回歸------------------------------"""
def loaddata(filename):
# 開啟乙個用逗號「,」分隔的文字檔案,該檔案的第一列數值全為1.0,即設定x0=1.0。
# 預設檔案每行最後乙個值是目標值,計算每行資料(非目標值)的個數numfeat
# 該文字檔案每行都需要有資料,若沒有資料也會報錯,所以不要用回車鍵在文字下面弄非常多的空格
numfeat=len(open(filename).readline().split(','))-1
print("每行非目標值的資料個數:",numfeat)
datamat=;labelmat=
fr=open(filename)
for line in fr.readlines():
linearr=
curline=line.strip('\n').split(',')
for i in range(numfeat):
print("r1:",shape(labelmat))
#print(labelmat)
return datamat,labelmat
#datamat,labelmat都是list型別,傳給standregression函式的兩個形參xarr,yarr
def standregression(xarr,yarr):
#xarr,yarr都是list型別,xarr是多維的mat轉置後就是乙個矩陣,
# 而ymat是一維的list,mat後變成1*2的矩陣,必須轉置一下變成列向量,因為y本身就是個列向量
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
"""--------------------------嶺回歸(正則化線性回歸)---------------------------"""
def ridgeregression(xmat,ymat,lam=0.2):
xtx = xmat.t*xmat
denom = xtx +eye(shape(xmat)[1])*lam #lam就是蘭木塔
if linalg.det(denom) == 0:
print("this matrix is singular,cannot do inverese")
return
ws = denom.i * (xmat.t*ymat) #嶺回歸下求得的最佳回歸係數ws
return ws
def ridgetest(xarr,yarr):
xmat = mat(xarr); ymat = mat(yarr).t
#資料標準化
ymean = mean(ymat,0)
ymat=(ymat-ymean) #ymat只有一列,不需要再除以方差
xmeans=mean(xmat,0)
xvar=var(xmat,0) #方差
xmat=(xmat-xmeans)/xvar
numtestpts=30
wmat=zeros((numtestpts,shape(xmat)[1]))
for i in range(numtestpts):
ws=ridgeregression(xmat,ymat,exp(i-10))
#print(ws)
wmat[i,:]=ws.t
return wmat
重新建立乙個python檔案,用於呼叫regression.py檔案中的函式並進行驗證以及畫出擬合的曲線
注釋掉的**並非錯誤,是執行時怕同一檔案下相同變數名給出不同的定義而報錯。
#coding:utf-8
from numpy import *
import regression #匯入regression這個已經寫好的檔案
import matplotlib.pyplot as plt
"""*********************普通線性回歸擬合曲線********************************"""
xarr,yarr=regression.loaddata("d:\pycharmprojects\exo.txt")
ws=regression.standregression(xarr,yarr)
xmat=mat(xarr)
ymat=mat(yarr).t
print("r2:",shape(ymat))
fig=plt.figure()
ax=fig.add_subplot(111)
ax.scatter(xmat[:,3].flatten().a[0],ymat[:,0].flatten().a[0])
xcopy=xmat.copy()
xcopy.sort(0)
yhat=xcopy*ws
ax.plot(xcopy[:,3],yhat)
plt.show()
"""**************************嶺回歸lamda函式曲線***********************"""
# abx,aby=regression.loaddata("d:\pycharmprojects\exo.txt")
# ridgeweights=regression.ridgetest(abx,aby)
# fig=plt.figure()
# ax=fig.add_subplot(111)
# ax.plot(ridgeweights)
# ax.set_xlabel("log(lambda)")
# plt.show()
"""************************嶺回歸擬合曲線*************************"""
# xarr,yarr=regression.loaddata("d:\pycharmprojects\exo.txt")
# xmat=mat(xarr)
# ymat=mat(yarr).t
# ws=regression.ridgeregression(xmat,ymat)
## fig=plt.figure()
# ax=fig.add_subplot(111)
# ax.scatter(xmat[:,3].flatten().a[0],ymat[:,0].flatten().a[0])
## xcopy=xmat.copy()
# xcopy.sort(0)
# yhat=xcopy*ws
# ax.plot(xcopy[:,3],yhat)
## plt.show()
機器學習線性回歸案例講解 機器學習實戰 線性回歸
本文將用 泰坦尼克船員獲救 這一案例展示一下使用線性回歸建模的流程。首先匯入原始的資料並展示資料的前5行,大致了解一下資料的情況。原始資料中分別有以下幾列資訊 passengerid survived pclass name age sibsp parch ticket fare cabin emb...
機器學習實戰之線性回歸
之前我們學習的機器學習演算法都是屬於分類演算法,也就是 值是離散值。當 值為連續值時,就需要使用回歸演算法。本文將介紹線性回歸的原理和 實現。如圖所示,這時一組二維的資料,我們先想想如何通過一條直線較好的擬合這些散點了?直白的說 盡量讓擬合的直線穿過這些散點 這些點離擬合直線很近 目標函式 要使這些...
機器學習實戰之線性回歸
線性回歸原理與推導 如圖所示,這時一組二維的資料,我們先想想如何通過一條直線較好的擬合這些散點了?直白的說 盡量讓擬合的直線穿過這些散點 這些點離擬合直線很近 目標函式 要使這些點離擬合直線很近,我們需要用數學公式來表示。首先,我們要求的直線公式為 y xtw。我們這裡要求的就是這個w向量 類似於l...