學習率
$\eta$
學習率($0<\eta<1$
)
學習率太大,容易造成權值調整不穩定
學習率太小,權值調整太慢,迭代次數太多
收斂條件
1 誤差小於某個預先設定的較小的值
2 兩次迭代之間的權值變化已經很小
3 設定最大迭代次數,當迭代超過最大次數就停止
題目:假設平面座標系上有三個點,(3,3),(4,3)這兩個點的標籤是1,(1,1)這個點的標籤是-1.構建神經網絡。
思路:我們要分類的數據是2維數據,所以只需要2個輸入節點,我們可以把神經元的偏置值也設置成一個節點,
這樣我們需要3個輸入節點。
輸入數據有3個(1,3,3),(1,4,3),(1,1,1)
數據對應的標籤爲(1,1,-1)
初始化權重w_0,w_1,w_3取-1到1的隨機數
學習率(learning rate)設置爲0.11
激活函數爲sign函數
import numpy as np
import matplotlib.pyplot as plt
#輸入數據
X=np.array([[1,3,3],
[1,4,3],
[1,1,1]])
#標籤
Y=np.array([1,1,-1])
#權值初始化,1行3列,取值範圍-1到1
W=(np.random.random(3)-0.5)*2
print(W)
#學習率設置
lr=0.11
#計算迭代次數
n=0
#神經網絡輸出
o=0
def update():
global X,Y,W,lr,n
n+=1
o=np.sign(np.dot(X,W.T))
W_c=lr*((Y-o.T).dot(X))/int(X.shape[0])
W=W+W_c
for _ in range(100):
update() #更新權值
print(W) #打印當前權值
print(n) #打印迭代次數
o=np.sign(np.dot(X,W.T)) #計算當前輸出
if(o==Y.T).all(): #如果實際輸出等於期望輸出,模型收斂,循環結束
print('Finished')
print('epoch:',n)
break
#正樣本
x1=[3,4]
y1=[3,3]
#負樣本
x2=[1]
y2=[1]
#計算分界線的斜率以及截距
k=-W[1]/W[2]
d=-W[0]/W[2]
print('k=',k,',d=',d)
xdata=np.linspace(0,5)
plt.plot(xdata,xdata*k+d,'r')
plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'yo')
plt.show()
注意: 單層感知器不能解決異或問題
例2 異或問題
0^0 = 0
0^1 = 1
1^0 = 1
1^1 = 0
import numpy as np
import matplotlib.pyplot as plt
#輸入數據
X=np.array([[1,0,0],
[1,0,1],
[1,1,0],
[1,1,1]])
#標籤
Y=np.array([-1,1,1,-1])
#權值初始化,1行3列,取值範圍-1到1
W=(np.random.random(3)-0.5)*2
print(W)
#學習率設置
lr=0.11
#計算迭代次數
n=0
#神經網絡輸出
o=0
def update():
global X,Y,W,lr,n
n+=1
o=np.sign(np.dot(X,W.T))
W_c=lr*((Y-o.T).dot(X))/int(X.shape[0])
W=W+W_c
for _ in range(100):
update() #更新權值
print(W) #打印當前權值
print(n) #打印迭代次數
o=np.sign(np.dot(X,W.T)) #計算當前輸出
if(o==Y.T).all(): #如果實際輸出等於期望輸出,模型收斂,循環結束
print('Finished')
print('epoch:',n)
break
#正樣本
x1=[0,1]
y1=[1,0]
#負樣本
x2=[0,1]
y2=[0,1]
#計算分界線的斜率以及截距
k=-W[1]/W[2]
d=-W[0]/W[2]
print('k=',k,',d=',d)
xdata=np.linspace(-0.05,1.05)
plt.plot(xdata,xdata*k+d,'r')
plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'yo')
plt.show()