日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习-预测之BP神经网络模型原理及实战

發(fā)布時(shí)間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习-预测之BP神经网络模型原理及实战 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

BP神經(jīng)網(wǎng)絡(luò)模型

簡介

BP網(wǎng)絡(luò)(Back-Propagation Network)是1986年被提出的,是一種按誤差逆向傳播算法訓(xùn)練的多層前饋網(wǎng)絡(luò),是目前應(yīng)用最廣泛的神經(jīng)網(wǎng)絡(luò)模型之一,用于函數(shù)逼近、模型識別分類、數(shù)據(jù)壓縮和時(shí)間序列預(yù)測等。

BP網(wǎng)絡(luò)又稱為反向傳播神經(jīng)網(wǎng)絡(luò),它是一種有監(jiān)督的學(xué)習(xí)算法,具有很強(qiáng)的自適應(yīng)、自學(xué)習(xí)、非線性映射能力,能較好地解決數(shù)據(jù)少、信息貧、不確定性問題,且不受非線性模型的限制。一個(gè)典型的BP網(wǎng)絡(luò)應(yīng)該包括三層:輸入層、隱含層和輸出層。(關(guān)于神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)術(shù)語等知識可以查看我之前的博客)各層之間全連接,同層之間無連接。隱含層可以有很多層,對于一般的神經(jīng)網(wǎng)絡(luò)而言,單層的隱含層已經(jīng)足夠了。上圖是一個(gè)典型的BP神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖。

學(xué)習(xí)過程

正向傳播

輸入信號從輸入層經(jīng)過各個(gè)隱含層向輸出層傳播從,在輸出層得到實(shí)際的響應(yīng)值,若實(shí)際值與期望值誤差較大,就會轉(zhuǎn)入誤差反向傳播階段。

反向傳播

按照梯度下降的方法從輸出層經(jīng)過各個(gè)隱含層并逐層不斷地調(diào)整各神經(jīng)元的連接權(quán)值和閾值,反復(fù)迭代,直到網(wǎng)絡(luò)輸出的誤差減少到可以接受的程度,或者進(jìn)行到預(yù)先設(shè)定的學(xué)習(xí)次數(shù)。

BP神經(jīng)網(wǎng)絡(luò)通過有指導(dǎo)的學(xué)習(xí)方式進(jìn)行訓(xùn)練和學(xué)習(xí)。標(biāo)準(zhǔn)的BP算法采用誤差函數(shù)按梯度下降的方法學(xué)習(xí),使網(wǎng)絡(luò)的設(shè)計(jì)輸出值和期望輸出值之間的均方誤差最小。BP神經(jīng)網(wǎng)絡(luò)的傳輸函數(shù)通常采用sigmoid函數(shù),而輸出層則采用線性傳輸函數(shù)。

原理

輸入輸出層的設(shè)計(jì)

  • 輸入層
    • 輸入層各神經(jīng)元負(fù)責(zé)接收來自外界的輸入信息,并傳遞給中間層各神經(jīng)元,它的節(jié)點(diǎn)數(shù)為輸入變量的個(gè)數(shù)。
  • 輸出層
    • 輸出層向外界輸出信息處理結(jié)果。它的節(jié)點(diǎn)個(gè)數(shù)為輸出變量的個(gè)數(shù)。

隱含層設(shè)計(jì)

  • 內(nèi)部信息處理層,負(fù)責(zé)信息變換,根據(jù)信息變換能力的需求,中間層可以設(shè)計(jì)為單隱層或多隱層結(jié)構(gòu);最后一個(gè)隱含層傳遞信息到輸出層各神經(jīng)元,經(jīng)過進(jìn)一步處理后,完成一次學(xué)習(xí)的正向傳播處理過程。
  • 有關(guān)研究表明,一個(gè)隱含層的神經(jīng)網(wǎng)絡(luò),只要隱節(jié)點(diǎn)足夠多,就可以以任意精度逼近一個(gè)非線性函數(shù)。因此,通常采用含有一個(gè)隱層的三層多輸入單輸出的BP神經(jīng)網(wǎng)絡(luò)建立預(yù)測模型。
  • 在網(wǎng)絡(luò)設(shè)計(jì)過程中,隱層神經(jīng)元數(shù)的確定十分重要。隱層神經(jīng)元數(shù)目過多,會加大網(wǎng)絡(luò)計(jì)算量并容易產(chǎn)生過度擬合問題;神經(jīng)元數(shù)目過少,則會影響網(wǎng)絡(luò)性能,達(dá)不到預(yù)期效果。網(wǎng)絡(luò)中隱層神經(jīng)元的數(shù)目與實(shí)際問題的復(fù)雜程度、輸入和輸出層的神經(jīng)元數(shù)及對期望誤差的設(shè)定有著直接的關(guān)系。目前,對于隱層的神經(jīng)元數(shù)目的確定沒有明確的公式,只有一些基于經(jīng)驗(yàn)的公式,神經(jīng)元的個(gè)數(shù)最終需要根據(jù)經(jīng)驗(yàn)和多次試驗(yàn)確定。
    L=n+m+aL= \sqrt {n+m} + aL=n+m?+a
    其中,n為輸入層神經(jīng)元個(gè)數(shù),m為輸出層神經(jīng)元個(gè)數(shù),a為1到10之間的常數(shù)。

BP算法改進(jìn)

雖然BP神經(jīng)網(wǎng)絡(luò)具有高度非線性和較強(qiáng)的泛化能力,但也存在收斂速度慢、迭代步數(shù)多、易陷入局部極小和全局搜索能力差等缺點(diǎn)。可以采用增加動量項(xiàng)、自適應(yīng)調(diào)節(jié)學(xué)習(xí)率、引入陡度因子等方法進(jìn)行改進(jìn)。

  • 增加動量項(xiàng)
    • 加速算法收斂
    • wij=wij?η1×δij×xi+α?wijw_{ij} = w_{ij} - \eta_1 \times \delta_{ij}\times x_i + \alpha ?w_{ij}wij?=wij??η1?×δij?×xi?+α?wij?
    • 其中,動量因子α\alphaα一般為0.1~0.8。
  • 自適應(yīng)調(diào)節(jié)率
  • 引入陡度因子

實(shí)戰(zhàn)

案例使用神經(jīng)網(wǎng)絡(luò)預(yù)測公路運(yùn)量。

過程

  • 劃分訓(xùn)練集和驗(yàn)證集
  • 建立模型,設(shè)定模型參數(shù)
  • 對模型進(jìn)行訓(xùn)練并可視化損失函數(shù)變化
  • 模型驗(yàn)證并使用(觀察預(yù)測值和真實(shí)值對比)

    可以看到,效果還是很顯著的。
import numpy as np import matplotlib.pyplot as pltdef logsig(x):"""定義激活函數(shù):param x::return:"""return 1/(1+np.exp(-x))def get_Data():"""讀入數(shù)據(jù),轉(zhuǎn)為歸一化矩陣:return:"""# 讀入數(shù)據(jù)# 人數(shù)(單位:萬人)population = [20.55, 22.44, 25.37, 27.13, 29.45, 30.10, 30.96, 34.06, 36.42, 38.09, 39.13, 39.99, 41.93, 44.59,47.30, 52.89, 55.73, 56.76, 59.17, 60.63]# 機(jī)動車數(shù)(單位:萬輛)vehicle = [0.6, 0.75, 0.85, 0.9, 1.05, 1.35, 1.45, 1.6, 1.7, 1.85, 2.15, 2.2, 2.25, 2.35, 2.5, 2.6, 2.7, 2.85, 2.95,3.1]# 公路面積(單位:萬平方公里)roadarea = [0.09, 0.11, 0.11, 0.14, 0.20, 0.23, 0.23, 0.32, 0.32, 0.34, 0.36, 0.36, 0.38, 0.49, 0.56, 0.59, 0.59,0.67, 0.69, 0.79]# 公路客運(yùn)量(單位:萬人)passengertraffic = [5126, 6217, 7730, 9145, 10460, 11387, 12353, 15750, 18304, 19836, 21024, 19490, 20433, 22598,25107, 33442, 36836, 40548, 42927, 43462]# 公路貨運(yùn)量(單位:萬噸)freighttraffic = [1237, 1379, 1385, 1399, 1663, 1714, 1834, 4322, 8132, 8936, 11099, 11203, 10524, 11115, 13320,16762, 18673, 20724, 20803, 21804]# 將數(shù)據(jù)轉(zhuǎn)換成矩陣,并使用最大最小歸一數(shù)據(jù)# 輸入數(shù)據(jù)samplein = np.mat([population, vehicle, roadarea]) # 3*20# 得到最大最小值,方便歸一sampleinminmax = np.array([samplein.min(axis=1).T.tolist()[0], samplein.max(axis=1).T.tolist()[0]]).transpose()# 輸出數(shù)據(jù)sampleout = np.mat([passengertraffic, freighttraffic]) # 2*20# 得到最大最小值,方便歸一sampleoutminmax = np.array([sampleout.min(axis=1).T.tolist()[0], sampleout.max(axis=1).T.tolist()[0]]).transpose()sampleinnorm = (2 * (np.array(samplein.T) - sampleinminmax.transpose()[0]) / (sampleinminmax.transpose()[1] - sampleinminmax.transpose()[0]) - 1).transpose()sampleoutnorm = (2 * (np.array(sampleout.T).astype(float) - sampleoutminmax.transpose()[0]) / (sampleoutminmax.transpose()[1] - sampleoutminmax.transpose()[0]) - 1).transpose()# 給輸入樣本添加噪聲noise = 0.03 * np.random.rand(sampleoutnorm.shape[0], sampleoutnorm.shape[1])sampleoutnorm += noisereturn samplein, sampleout, sampleinminmax, sampleoutminmax, sampleinnorm, sampleoutnormdef model_create():"""建立模型并訓(xùn)練:return:"""maxepochs = 60000learnrate = 0.035errorfinal = 0.65 * 10 ** (-3)samnum = 20indim = 3outdim = 2hiddenunitnum = 8w1 = 0.5 * np.random.rand(hiddenunitnum, indim) - 0.1b1 = 0.5 * np.random.rand(hiddenunitnum, 1) - 0.1w2 = 0.5 * np.random.rand(outdim, hiddenunitnum) - 0.1b2 = 0.5 * np.random.rand(outdim, 1) - 0.1errhistory = []# 開始訓(xùn)練模型samplein, sampleout, sampleinminmax, sampleoutminmax, sampleinnorm, sampleoutnorm = get_Data()for i in range(maxepochs):hiddenout = logsig((np.dot(w1, sampleinnorm).transpose() + b1.transpose())).transpose()networkout = (np.dot(w2, hiddenout).transpose() + b2.transpose()).transpose()err = sampleoutnorm - networkoutsse = sum(sum(err ** 2))errhistory.append(sse)if sse < errorfinal:breakdelta2 = errdelta1 = np.dot(w2.transpose(), delta2) * hiddenout * (1 - hiddenout)dw2 = np.dot(delta2, hiddenout.transpose())db2 = np.dot(delta2, np.ones((samnum, 1)))dw1 = np.dot(delta1, sampleinnorm.transpose())db1 = np.dot(delta1, np.ones((samnum, 1)))w2 += learnrate * dw2b2 += learnrate * db2w1 += learnrate * dw1b1 += learnrate * db1# 繪制誤差曲線圖errhistory10 = np.log10(errhistory)minerr = min(errhistory10)plt.plot(errhistory10)plt.plot(range(0, i + 1000, 1000), [minerr] * len(range(0, i + 1000, 1000)))ax = plt.gca()ax.set_yticks([-2, -1, 0, 1, 2, minerr])ax.set_yticklabels([u'$10^{-2}$', u'$10^{-1}$', u'$10^{1}$', u'$10^{2}$', str(('%.4f' % np.power(10, minerr)))])ax.set_xlabel('iteration')ax.set_ylabel('error')ax.set_title('Error Histroy')plt.savefig('errorhistory.png', dpi=700)plt.close()# 實(shí)現(xiàn)仿真輸出和實(shí)際輸出對比圖hiddenout = logsig((np.dot(w1, sampleinnorm).transpose() + b1.transpose())).transpose()networkout = (np.dot(w2, hiddenout).transpose() + b2.transpose()).transpose()diff = sampleoutminmax[:, 1] - sampleoutminmax[:, 0]networkout2 = (networkout + 1) / 2networkout2[0] = networkout2[0] * diff[0] + sampleoutminmax[0][0]networkout2[1] = networkout2[1] * diff[1] + sampleoutminmax[1][0]sampleout = np.array(sampleout)fig, axes = plt.subplots(nrows=2, ncols=1, figsize=(12, 10))line1, = axes[0].plot(networkout2[0], 'k', marker=u'$\circ$')line2, = axes[0].plot(sampleout[0], 'r', markeredgecolor='b', marker=u'$\star$', markersize=9)axes[0].legend((line1, line2), ('simulation output', 'real output'), loc='upper left')yticks = [0, 20000, 40000, 60000]ytickslabel = [u'$0$', u'$2$', u'$4$', u'$6$']axes[0].set_yticks(yticks)axes[0].set_yticklabels(ytickslabel)axes[0].set_ylabel(u'passenger traffic$(10^4)$')xticks = range(0, 20, 2)xtickslabel = range(1990, 2010, 2)axes[0].set_xticks(xticks)axes[0].set_xticklabels(xtickslabel)axes[0].set_xlabel(u'year')axes[0].set_title('Passenger Traffic Simulation')line3, = axes[1].plot(networkout2[1], 'k', marker=u'$\circ$')line4, = axes[1].plot(sampleout[1], 'r', markeredgecolor='b', marker=u'$\star$', markersize=9)axes[1].legend((line3, line4), ('simulation output', 'real output'), loc='upper left')yticks = [0, 10000, 20000, 30000]ytickslabel = [u'$0$', u'$1$', u'$2$', u'$3$']axes[1].set_yticks(yticks)axes[1].set_yticklabels(ytickslabel)axes[1].set_ylabel(u'freight traffic$(10^4)$')xticks = range(0, 20, 2)xtickslabel = range(1990, 2010, 2)axes[1].set_xticks(xticks)axes[1].set_xticklabels(xtickslabel)axes[1].set_xlabel(u'year')axes[1].set_title('Freight Traffic Simulation')fig.savefig('simulation.png', dpi=500, bbox_inches='tight')plt.show()if __name__ == '__main__':model_create()

補(bǔ)充說明

參考書《Python3數(shù)據(jù)分析與機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》,具體數(shù)據(jù)集和代碼可以查看我的GitHub,歡迎star或者fork。

總結(jié)

以上是生活随笔為你收集整理的机器学习-预测之BP神经网络模型原理及实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。