西瓜書 課後習題5 5 標準bp演算法,累計bp演算法

2021-09-01 20:37:40 字數 3823 閱讀 9067

import numpy as np

def dataset():

'''西瓜3.0資料集離散化

'''x = np.mat('2,3,3,2,1,2,3,3,3,2,1,1,2,1,3,1,2;\

1,1,1,1,1,2,2,2,2,3,3,1,2,2,2,1,1;\

2,3,2,3,2,2,2,2,3,1,1,2,2,3,2,2,3;\

3,3,3,3,3,3,2,3,2,3,1,1,2,2,3,1,2;\

1,1,1,1,1,2,2,2,2,3,3,3,1,1,2,3,2;\

1,1,1,1,1,2,2,1,1,2,1,2,1,1,2,1,1;\

0.697,0.774,0.634,0.668,0.556,0.403,0.481,0.437,0.666,0.243,0.245,0.343,0.639,0.657,0.360,0.593,0.719;\

0.460,0.376,0.264,0.318,0.215,0.237,0.149,0.211,0.091,0.267,0.057,0.099,0.161,0.198,0.370,0.042,0.103\

').t

x = np.array(x)

y = np.mat('1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0')

y = np.array(y).t

return x, y

def sigmoid(x):

'''sigmoid函式

'''return 1.0 / (1.0 + np.exp(-x))

def bpa(hiddenlayer):

'''累計誤差逆傳播

:param hiddenlayer: 隱層數目

'''# 初始化引數

x, y = dataset() # 資料集和標籤,分別為shpae[n,d],shape[n.l],這裡的l=1

v = np.random.rand(x.shape[1], hiddenlayer) # shape[d,q]

w = np.random.rand(hiddenlayer, y.shape[1]) # shape[q,l]

t0 = np.random.rand(1, hiddenlayer) # shape[1,q]

t1 = np.random.rand(1, y.shape[1]) # shape[1,l]

# 設定初始化變數

r = 0.1 # 學習率

error = 0.001 # 最大允許誤差

maxtrainnum = 1000000 # 最大學習次數

trainnum = 0 # 訓練次數

loss = 0

flag = 1

while flag:

b = sigmoid(x.dot(v) - t0) # shape[n,q]

y0 = sigmoid(b.dot(w) - t1) # shape[l,1]

loss = sum((y0 - y) ** 2) / x.shape[0]

if loss < error or trainnum > maxtrainnum:

break

trainnum += 1

# 更新引數

g = y0 * (1 - y0) * (y - y0) # shape[n,l]

e = b * (1 - b) * g.dot(w.t) # shape[n,q]

w += r * b.t.dot(g)

t1 -= r * g.sum(axis=0)

v += r * x.t.dot(e)

t0 -= r * e.sum(axis=0)

# 輸出訓練結果引數

print('累計誤差逆傳播法 訓練次數: ' + str(trainnum))

print('v:')

print(v)

print('w:')

print(w)

print('t0:')

print(t0)

print('t1:')

print(t1)

print('loss: ' + str(loss[0]))

def bps(hiddenlayer):

'''標準誤差逆傳播

:param hiddenlayer: 隱層數目

'''# 初始化引數

x, y = dataset() # 資料集和標籤,分別為shpae[n,d],shape[n.l],這裡的l=1

v = np.random.rand(x.shape[1], hiddenlayer) # shape[d,q]

w = np.random.rand(hiddenlayer, y.shape[1]) # shape[q,l]

t0 = np.random.rand(1, hiddenlayer) # shape[1,q]

t1 = np.random.rand(1, y.shape[1]) # shape[1,l]

# 設定初始化變數

r = 0.1 # 學習率

error = 0.001 # 最大允許誤差

maxtrainnum = 1000000 # 最大學習次數

trainnum = 0 # 訓練次數

loss = 0

flag = 1

while flag:

for k in range(x.shape[0]):

b = sigmoid(x.dot(v) - t0) # shape[n,q]

y0 = sigmoid(b.dot(w) - t1) # shape[l,1]

loss = sum((y0 - y) ** 2) / x.shape[0]

if loss < error or trainnum > maxtrainnum:

flag = 0

break

trainnum += 1

# 更新引數

g = y0[k] * (1 - y0[k]) * (y[k] - y0[k]) # shape[1,l]

g = g.reshape(1, g.size) # shape[1,l]

b = b[k]

b = b.reshape(1, b.size) # shape[1,q]

e = b * (1 - b) * g.dot(w.t) # shape[1,q]

w += r * b.t.dot(g) # shape[q,l]

t1 -= r * g

v += r * x[k].reshape(1, x[k].size).t.dot(e) # shape[d,q]

t0 -= r * e

# 輸出訓練結果引數

print('標準誤差逆傳播法 訓練次數: ' + str(trainnum))

print('v:')

print(v)

print('w:')

print(w)

print('t0:')

print(t0)

print('t1:')

print(t1)

print('loss: ' + str(loss[0]))

if __name__ == '__main__':

bpa(5) # 隱層數目為5

bps(5)

結果:累計誤差逆傳播法 訓練次數: 7758           loss: 0.0009998732359117453

標準誤差逆傳播法 訓練次數: 205086       loss: 0.0009999861270941792     

參考:

機器學習西瓜書課後習題答案 1 緒論

1.訊息推送 比如當我搜尋 機器學習 之後,再開啟某些網頁的時候,會推送有關機器學習培訓的廣告 或參考 以下是部落格的結果 1.1求版本空間 首先看版本空間的定義,這篇文章寫的很好 概況說來,版本空間就是從假設空間剔除了與正例不一致和與反例一致的假設,它可以看成是對正例的最大泛化。現在只有西瓜1和西...

西瓜書習題作答

如出錯誤人,請大佬斧正!表1.1中只包含編號為1和4的兩個樣例,即 編號色澤 根蒂敲聲好瓜1 青綠蜷縮濁響是 4烏黑稍蜷沉悶 否那麼,根據書中介紹的方法,在搜尋過程中刪除與正例不一致的假設 和 或 與反例一致的假設,最後得到以下的假設集合 青綠 蜷縮 濁響 青綠 蜷縮 青綠 濁響 蜷縮 濁響 青綠 ...

西瓜書第1章習題

1.1 試給出相應的版本空間。首先有乙個 假設空間 現實問題中假設空間一般很大。然後有許多策略是可以對假設空間進行搜尋,搜尋過程中刪除與正例不一致的假設 和反例一致的假設。最後選出來的假設的集合,就叫做 版本空間 1.2 若使用最多包含k個合取式的析合正規化來表達表1.1西瓜分類問題的假設空間,估算...