什么是神經(jīng)網(wǎng)絡(luò)
M-P神經(jīng)元模型是一直沿用至今的神經(jīng)元模型,神經(jīng)元接收到來自n個其他神經(jīng)元傳遞過來的輸入信號,這些輸入信號通過帶權(quán)重的連接進行傳遞,神經(jīng)元接收到的總輸入將與神經(jīng)元的閾值進行比較,然后通過“激活函數(shù)”處理以產(chǎn)生神經(jīng)元的輸出贺嫂。
理想中的激活函數(shù)是階躍函數(shù),它將輸入值映射為輸出值“0”或“1”雁乡,顯然“1”對應(yīng)于神經(jīng)元興奮第喳,“0”對應(yīng)于神經(jīng)元抑制。然而踱稍,階躍函數(shù)具有不連續(xù)性曲饱、不光滑等不太好的性質(zhì),因此實際常用Sigmoid函數(shù)作為激活函數(shù)珠月。Sigmoid把可能在較大范圍內(nèi)變化的輸入值擠壓到(0扩淀,1)輸出值的范圍內(nèi),因此有時也稱為“擠壓函數(shù)”桥温。
把許多個這樣的神經(jīng)元按一定的層次結(jié)構(gòu)連接起來引矩,就得到了神經(jīng)網(wǎng)絡(luò)梁丘。
誤差逆?zhèn)鞑ニ惴?/h2>
誤差逆?zhèn)鞑ィ╡rror BackPropagation侵浸,簡稱BP)算法是迄今最成功的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)算法⊥拢現(xiàn)實任務(wù)中使用神經(jīng)網(wǎng)絡(luò)時,大多是在使用BP算法進行訓(xùn)練掏觉。通常說“BP網(wǎng)絡(luò)”時区端,一般是指用BP算法訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò)。
參數(shù)說明:
下圖給出了BP算法的工作流程酱塔。對每個訓(xùn)練樣例沥邻,BP算法執(zhí)行以下操作:先將輸入示例提供給輸入層神經(jīng)元,然后逐層將信號前傳羊娃,知道產(chǎn)生輸出層的結(jié)果唐全;然后計算輸出層的誤差(第4-5行),再將誤差逆?zhèn)鞑ブ岭[層神經(jīng)元(第6行)蕊玷,最后根據(jù)隱層神經(jīng)元的誤差來對連接權(quán)和閾值進行調(diào)整(第7行)邮利。該迭代過程循環(huán)進行,直到達到某些停止條件為止垃帅,例如訓(xùn)練誤差已達到一個很小的值延届。
需注意的是,BP算法的目標(biāo)是要最小化訓(xùn)練集D上的累積誤差
但上圖的更新規(guī)則是基于單個的Ek推導(dǎo)而得贸诚。如果類似地推導(dǎo)出基于累積誤差最小化的更新規(guī)則方庭,就得到了累積誤差逆?zhèn)鞑ニ惴ā@鄯eBP算法和標(biāo)準(zhǔn)BP算法都很常用酱固。一般來說二鳄,標(biāo)準(zhǔn)BP算法每次更新只針對單個樣例,參數(shù)更新的非常頻繁媒怯,而且對不同樣例更新的效果可能出現(xiàn)“抵消”現(xiàn)象订讼。因此,為了達到同樣的累積誤差極小點扇苞,標(biāo)準(zhǔn)BP算法往往需進行更多次迭代欺殿。累積BP算法直接針對累積誤差最小化,它在讀取整個訓(xùn)練集D一遍后才對參數(shù)進行更新鳖敷,其參數(shù)更新的頻率低得多脖苏。但在很多任務(wù)中,累積誤差下降到一定程度之后定踱,進一步下降會非常緩慢棍潘,這時標(biāo)準(zhǔn)BP往往會更快獲得較好的解,尤其是在訓(xùn)練集D非常大時更明顯。
由于其強大的表示能力亦歉,BP神經(jīng)網(wǎng)絡(luò)經(jīng)常遭遇過擬合恤浪,其訓(xùn)練誤差持續(xù)降低,但測試誤差卻可能上升肴楷。有兩種策略常用來緩解BP網(wǎng)絡(luò)的過擬合水由。第一種策略是“早停”:將數(shù)據(jù)集分成訓(xùn)練集和測試集赛蔫,訓(xùn)練集用來計算梯度砂客、更新連接權(quán)和閾值,驗證集用來估計誤差呵恢,若訓(xùn)練集誤差降低但驗證集誤差升高鞠值,則停止訓(xùn)練,同時返回具有最小驗證集誤差的連接權(quán)和閾值渗钉。第二種策略是“正則化”齿诉,其基本思想是在誤差目標(biāo)函數(shù)中增加一個用于描述網(wǎng)絡(luò)復(fù)雜度的部分。
代碼部分
數(shù)據(jù)來自西瓜書P84讀取數(shù)據(jù)
import pandas as pd
import numpy as np
dataset = pd.read_csv('watermelon_3.csv', delimiter=",")
數(shù)據(jù)預(yù)處理
# 處理數(shù)據(jù)集
attributeMap = {}
attributeMap['淺白'] = 0
attributeMap['青綠'] = 0.5
attributeMap['烏黑'] = 1
attributeMap['蜷縮'] = 0
attributeMap['稍蜷'] = 0.5
attributeMap['硬挺'] = 1
attributeMap['沉悶'] = 0
attributeMap['濁響'] = 0.5
attributeMap['清脆'] = 1
attributeMap['模糊'] = 0
attributeMap['稍糊'] = 0.5
attributeMap['清晰'] = 1
attributeMap['凹陷'] = 0
attributeMap['稍凹'] = 0.5
attributeMap['平坦'] = 1
attributeMap['硬滑'] = 0
attributeMap['軟粘'] = 1
attributeMap['否'] = 0
attributeMap['是'] = 1
del dataset['編號']
dataset = np.array(dataset)
m, n = np.shape(dataset)
for i in range(m):
for j in range(n):
if dataset[i, j] in attributeMap:
dataset[i, j] = attributeMap[dataset[i, j]]
dataset[i, j] = round(dataset[i, j], 3)
trueY = dataset[:, n-1]
X = dataset[:, :n-1]
m, n = np.shape(X)
初始化參數(shù)
# P101,初始化參數(shù)
import random
d = n # 輸入向量的維數(shù)
l = 1 # 輸出向量的維數(shù)
q = d+1 # 隱層節(jié)點的數(shù)量
theta = [random.random() for i in range(l)] # 輸出神經(jīng)元的閾值
gamma = [random.random() for i in range(q)] # 隱層神經(jīng)元的閾值
# v size= d*q .輸入和隱層神經(jīng)元之間的連接權(quán)重
v = [[random.random() for i in range(q)] for j in range(d)]
# w size= q*l .隱藏和輸出神經(jīng)元之間的連接權(quán)重
w = [[random.random() for i in range(l)] for j in range(q)]
eta = 0.2 # 學(xué)習(xí)率晌姚,控制每一輪迭代的步長
maxIter = 5000 # 最大訓(xùn)練次數(shù)
sigmoid函數(shù)
import math
def sigmoid(iX,dimension): # iX is a matrix with a dimension
if dimension == 1:
for i in range(len(iX)):
iX[i] = 1 / (1 + math.exp(-iX[i]))
else:
for i in range(len(iX)):
iX[i] = sigmoid(iX[i], dimension-1)
return iX
標(biāo)準(zhǔn)的誤差逆?zhèn)鞑?/p>
# 標(biāo)準(zhǔn)BP
while(maxIter > 0):
maxIter -= 1
sumE = 0
for i in range(m):
alpha = np.dot(X[i], v) # p101 line 2 from bottom, shape=1*q
b = sigmoid(alpha-gamma, 1) # b=f(alpha-gamma), shape=1*q
beta = np.dot(b, w) # shape=(1*q)*(q*l)=1*l
predictY = sigmoid(beta-theta, 1) # shape=1*l ,p102--5.3
E = sum((predictY-trueY[i])*(predictY-trueY[i]))/2 # 5.4
sumE += E # 5.16
# p104
g = predictY*(1-predictY)*(trueY[i]-predictY) # shape=1*l p103--5.10
e = b*(1-b)*((np.dot(w, g.T)).T) # shape=1*q , p104--5.15
w += eta*np.dot(b.reshape((q, 1)), g.reshape((1, l))) # 5.11
theta -= eta*g # 5.12
v += eta*np.dot(X[i].reshape((d, 1)), e.reshape((1, q))) # 5.13
gamma -= eta*e # 5.14
# print(sumE)
累積的誤差逆?zhèn)鞑?/p>
# #累積 BP
# trueY=trueY.reshape((m,l))
# while(maxIter>0):
# maxIter-=1
# sumE=0
# alpha = np.dot(X, v)#p101 line 2 from bottom, shape=m*q
# b = sigmoid(alpha - gamma,2) # b=f(alpha-gamma), shape=m*q
# beta = np.dot(b, w) # shape=(m*q)*(q*l)=m*l
# predictY = sigmoid(beta - theta,2) # shape=m*l ,p102--5.3
#
# E = sum(sum((predictY - trueY) * (predictY - trueY))) / 2 # 5.4
# # print(round(E,5))
# g = predictY * (1 - predictY) * (trueY - predictY) # shape=m*l p103--5.10
# e = b * (1 - b) * ((np.dot(w, g.T)).T) # shape=m*q , p104--5.15
# w += eta * np.dot(b.T, g) # 5.11 shape (q*l)=(q*m) * (m*l)
# theta -= eta * g # 5.12
# v += eta * np.dot(X.T, e) # 5.13 (d,q)=(d,m)*(m,q)
# gamma -= eta * e # 5.14
預(yù)測
def predict(iX):
alpha = np.dot(iX, v) # p101 line 2 from bottom, shape=m*q
b = sigmoid(alpha-gamma, 2) # b=f(alpha-gamma), shape=m*q
beta = np.dot(b, w) # shape=(m*q)*(q*l)=m*l
predictY = sigmoid(beta - theta, 2) # shape=m*l ,p102--5.3
return predictY
print(predict(X))
輸出結(jié)果代碼以及數(shù)據(jù)集可以到我碼云下載
- 文/潘曉璐 我一進店門世囊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窿祥,你說我怎么就攤上這事株憾。” “怎么了晒衩?”我有些...
- 文/不壞的土叔 我叫張陵嗤瞎,是天一觀的道長。 經(jīng)常有香客問我听系,道長贝奇,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任靠胜,我火速辦了婚禮掉瞳,結(jié)果婚禮上毕源,老公的妹妹穿的比我還像新娘。我一直安慰自己陕习,他們只是感情好霎褐,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著衡查,像睡著了一般。 火紅的嫁衣襯著肌膚如雪必盖。 梳的紋絲不亂的頭發(fā)上拌牲,一...
- 文/蒼蘭香墨 我猛地睜開眼嬉探,長吁一口氣:“原來是場噩夢啊……” “哼擦耀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涩堤,我...
- 正文 年R本政府宣布滞造,位于F島的核電站续室,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谒养。R本人自食惡果不足惜挺狰,卻給世界環(huán)境...
- 文/蒙蒙 一明郭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丰泊,春花似錦薯定、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至学赛,卻和暖如春年堆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盏浇。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 神經(jīng)網(wǎng)絡(luò) 原理 《機器學(xué)習(xí)》周志華 5.1 神經(jīng)元模型 神經(jīng)網(wǎng)絡(luò)中最0基本的成分是神經(jīng)元(neuron)模型。 M...
- 原文地址:http://www.cnblogs.com/subconscious/p/5058741.html 神...
- 美膩的十元又有劇了,沖著顏值馬上去看了更新的第一集聪姿。 開頭就是結(jié)婚時被準(zhǔn)新郎悔婚碴萧,但是半年過去了,十元演的桃桃還是...
- 耳朵厚大末购,衣食不愁的女人 大大的耳珠破喻,自然是「命好不怕運來磨」。有此耳相的女子盟榴,金錢運曹质、朋友運及婚運均相當(dāng)不錯,感...
- 朝來 朝來無事立窗間,細雨清風(fēng)人自閑迅办。 但使心同野雲(yún)往宅静,經(jīng)行何處不靑山。 秋夜 竹外千山靜站欺,更深意自閑姨夹。 綠窗秋月...