Python純代碼通過神經網絡實現線性回歸的擬合方式
純代碼通過神經網絡實現線性回歸的擬合
參考鏈接中的文章,有錯誤,我給更正了。
并且原文中是需要數據集文件的,我直接給替換成了一個數組,采用直接賦值的方式。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
class SimpleDataReader(object):
def __init__(self, data_file):
self.train_file_name = data_file
self.num_train = 0
self.XTrain = None
self.YTrain = None
# read data from file
def ReadData(self):
# data = np.load(self.train_file_name)
# self.XTrain = data["data"]
# self.YTrain = data["label"]
self.XTrain = np.array([0.95, 3, 4, 5.07, 6.03, 8.21, 8.85, 12.02, 15], dtype=float)
self.YTrain = np.array([5.1, 8.7, 11.5, 13, 15.3, 18, 21, 26.87, 32.5], dtype=float)
self.num_train = self.XTrain.shape[0]
#end if
# get batch training data
def GetSingleTrainSample(self, iteration):
x = self.XTrain[iteration]
y = self.YTrain[iteration]
return x, y
def GetWholeTrainSamples(self):
return self.XTrain, self.YTrain
class NeuralNet(object):
def __init__(self, eta):
self.eta = eta
self.w = 0
self.b = 0
def __forward(self, x):
z = x * self.w + self.b
return z
def __backward(self, x,y,z):
dz = z - y # 原錯誤為:dz = x * (z - y)
db = dz
dw = dz
return dw, db
def __update(self, dw, db):
self.w = self.w - self.eta * dw
self.b = self.b - self.eta * db
def train(self, dataReader):
for i in range(dataReader.num_train):
# get x and y value for one sample
x,y = dataReader.GetSingleTrainSample(i)
# get z from x,y
z = self.__forward(x)
# calculate gradient of w and b
dw, db = self.__backward(x, y, z)
# update w,b
self.__update(dw, db)
# end for
def inference(self, x):
return self.__forward(x)
if __name__ == '__main__':
# read data
sdr = SimpleDataReader('ch04.npz')
sdr.ReadData()
# create net
eta = 0.1
net = NeuralNet(eta)
net.train(sdr)
# result
print("w=%f,b=%f" %(net.w, net.b))
# 繪圖部分
trainX,trainY = sdr.GetWholeTrainSamples()
fig = plt.figure()
ax = fig.add_subplot(111)
# 繪制散點圖
ax.scatter(trainX,trainY)
# 繪制線性回歸
x = np.arange(0, 15, 0.01)
f = np.vectorize(net.inference, excluded=['x'])
plt.plot(x,f(x),color='red')
# 顯示圖表
plt.show()
Ref:
通過神經網絡實現線性回歸的擬合
Python使用線性回歸和神經網絡模型進行預測
公路運量主要包括公路客運量和公路貨運量兩個方面。
根據研究,某地區(qū)的公路運量主要與該地區(qū)的人數、機動車數量和公路面積有關,表5-11給出了某個地區(qū)20年的公路運量相關數據。
根據相關部門數據,該地區(qū)2010年和2011年的人數分別為73.39萬和75.55萬,機動車數量分別為3.9635萬輛和4.0975萬輛,公路面積分別為0.9880萬平方千米和1.0268萬平方千米。
請利用BP神經網絡預測該地區(qū)2010年和2011年的公路客運量和公路貨運量。
表5-11 運力數據表
年份 人數 機動車數量 公路面積 公里客運量 公里貨運量
1990 20.55 0.6 0.09 5126 1237
1991 22.44 0.75 0.11 6217 1379
1992 25.37 0.85 0.11 7730 1385
1993 27.13 0.9 0.14 9145 1399
1994 29.45 1.05 0.2 10460 1663
1995 30.1 1.35 0.23 11387 1714
1996 30.96 1.45 0.23 12353 1834
1997 34.06 1.6 0.32 15750 4322
1998 36.42 1.7 0.32 18304 8132
1999 38.09 1.85 0.34 19836 8936
2000 39.13 2.15 0.36 21024 11099
2001 39.99 2.2 0.36 19490 11203
2002 41.93 2.25 0.38 20433 10524
2003 44.59 2.35 0.49 22598 11115
2004 47.3 2.5 0.56 25107 13320
2005 52.89 2.6 0.59 33442 16762
2006 55.73 2.7 0.59 36836 18673
2007 56.76 2.85 0.67 40548 20724
2008 59.17 2.95 0.69 42927 20803
2009 60.63 3.1 0.79 43462 21804
注:數據取自《Matlab在數學建模中的應用(第2版)》,卓金武,第134頁。

#1.數據獲取
import pandas as pd
data = pd.read_excel('運力數據表.xlsx')
x = data.iloc[:20,:4]
y = data.iloc[:20,4:]
#2.導入線性回歸模塊,簡稱為LR
from sklearn.linear_model import LinearRegression as LR
lr = LR() #創(chuàng)建線性回歸模型類
lr.fit(x,y) #擬合
slr=lr.score(x,y) #判定系數 R^2
c_x=lr.coef_ #x對應的回歸系數
c_b=lr.intercept_ #回歸系數常數項
#3.預測
x1 = data.iloc[20:,:4]
r1=lr.predict(x1) #采用自帶函數預測
#print('x回歸系數為:',c_x)
#print('回歸系數常數項為:',c_b)
#print('判定系數為:',slr)
#print('樣本預測值為:',r1)
n=list(data["公里客運量(萬人)"])
n.extend(r1[:,0])
num=pd.DataFrame(n).dropna()
g=list(data["公里貨運量(萬噸)"])
g.extend(r1[:,1])
gravity=pd.DataFrame(g).dropna()
import pandas as pd
import matplotlib.pyplot as plt #導入繪圖庫中的pyplot模塊,并且簡稱為plt
#構造繪圖所需的橫軸數據列和縱軸數據列
#在figure界面上繪制線性圖
plt.rcParams['font.sans-serif'] = 'SimHei' #設置字體為SimHei
plt.figure(1)
plt.plot(data["年份"],num,'r*--') #紅色“*”號連續(xù)圖,
plt.xlabel('日期')
plt.ylabel('公里客運量(萬人')
plt.title('公里客運量(萬人)走勢圖')
plt.xticks(data["年份"],rotation = 45)
plt.savefig('myfigure1')
plt.figure(2)
plt.plot(data["年份"],gravity,'b*--') #紅色“*”號連續(xù)圖,
plt.xlabel('日期')
plt.ylabel('公里貨運量(萬噸)')
plt.title('公里貨運量(萬噸)走勢圖')
plt.xticks(data["年份"],rotation = 45)
plt.savefig('myfigure2')
from sklearn.neural_network import MLPRegressor
clf = MLPRegressor(solver='lbfgs', alpha=1e-5,hidden_layer_sizes=8, random_state=1)
clf.fit(x, y);
rv=clf.score(x,y)
r2=clf.predict(x1)
print('樣本預測值為:',r2)
n2=list(data["公里客運量(萬人)"])
n2.extend(r2[:,0])
num2=pd.DataFrame(n2).dropna()
g2=list(data["公里貨運量(萬噸)"])
g2.extend(r2[:,1])
gravity2=pd.DataFrame(g2).dropna()結果顯示:

總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python身份運算符is與is?not區(qū)別用法基礎教程
這篇文章主要為大家介紹了Python身份運算符is與is?not區(qū)別用法基礎教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
Python 中PyQt5 點擊主窗口彈出另一個窗口的實現方法
這篇文章主要介紹了Python 中PyQt5 點擊主窗口彈出另一個窗口的實現方法,本文代碼實例圖文相結合的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07

