人工神經網絡單層感知器代碼實現

這篇文章,我們介紹了什麼是單層感知器,這節課,我們來看看如果用代碼實現一個單層感知器

實驗問題:

假設平面座標系上有三個點(3,3),(4,3)這兩個座標點的標籤為 1 ,(1,1) 這個座標的標籤為-1 ,構建神經網絡來分類

思路:

二維數據,需要兩個數據點,將神經元偏置設置成另一個輸入點,一共需要三個輸入點

輸入數據:(1,3,3),(1,4,3),(1,1,1)

數據對應標籤為(1,1,-1)

初始化權值為w0,w1,w2 為 -1 到 1 的隨機數

學習率為0.11

激活函數:sign

最終我們確定下來的是w0,w1,w2

那麼分界線的表達式為: w0+w1*x1+w2*x2=0

因為x2為y軸上的值,那麼最終的表達式為:

y=(-w1/w2)*x - -w0/w2

權向量和輸入歸納為矩陣表達:

權值調整:

lr*(Y-O.T).dot(X)/int(X.shape[0])

(Y-O.T):是實際輸出與期望輸出的誤差

這樣我們就可以去套用權值校驗公式了

具體代碼為:

#單層感知器
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到1
W = (np.random.random(3)-0.5)*2
print("W is :",W)
#學習率設置
lr = 0.11
#計算迭代次數
n = 0
#神經網絡輸出
O=0

def update():
global X,Y,W,lr,n,O
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:",W) #打印權值
print("n",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)
print("d:",d)

xdata = np.linspace(0,5)

plt.figure();
plt.plot(xdata,xdata*k+d,"r")
plt.plot(x1,y1,"bo")
plt.plot(x2,y2,"yo")
plt.show()

結果:

人工神經網絡單層感知器代碼實現

後臺日誌為:

人工神經網絡單層感知器代碼實現

原文鏈接:https://blog.csdn.net/qq_24708791/article/details/78370915


分享到:


相關文章: