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西瓜分類問題的假設空間,估算...