理論部分:
注:訓(xùn)練時候使用purelin函數(shù)辱魁,輸出的時候使用sign函數(shù)用于分類
dj:期望輸出? oj:實際輸出
學(xué)習(xí)率可以通過開始選擇大值烟瞧,之后選擇小值來收斂。
局部最優(yōu)解在后續(xù)內(nèi)容中會提出解決方案
注;我個人認(rèn)為是解決非線性問題(決絕異或問題染簇,把異或問題分為兩類)未查證
代碼部分:使用python實現(xiàn)
import numpy as np
import matplotlib.pyplot as plt
#####################################
#線性神經(jīng)網(wǎng)絡(luò)與單層感知器代碼區(qū)別
#1激活函數(shù)不同
#2收斂條件改變了(收斂共有3個方式表現(xiàn) 一参滴、誤差達(dá)到比較小的值 二、權(quán)值的改變了比較小锻弓,區(qū)域穩(wěn)定? 三砾赔、循環(huán)一定次數(shù)后——本程序使用收斂條件)
#3引入多輸入來解決異或問題?
#####################################
#輸入數(shù)據(jù)? //小技巧其中X數(shù)組中的第一個 1 表示偏置b
#????????????????? [b,x1,x2]
#原數(shù)據(jù) X=np.array([[1,0,0],
#????????????????? [1,0,1],
#????????????????? [1,1,0],
#????????????????? [1,1,1]])#此時的X數(shù)據(jù)為四個點,用單層感知器無法進(jìn)行分類
# 升維后?????? [b,x1,x2,x1^2,x1*x2,x2^2]
X=np.array([[1,0,0,0,0,0],
??????????? [1,0,1,0,0,1],
??????????? [1,1,0,1,0,0],
??????????? [1,1,1,1,1,1]])#此時的X數(shù)據(jù)為四個點,用單層感知器無法進(jìn)行分類
#標(biāo)簽
Y=np.array([-1,1,1,-1])
#權(quán)值初始化,
W=(np.random.random(6)-0.5)*2
print(W)
#定義學(xué)習(xí)率
lr=0.11
#計算迭代次數(shù)變量
n=0
#神經(jīng)網(wǎng)絡(luò)的輸出
O=0
def update():
??? global X,Y,W,lr,n
??? n+=1
??? O=np.dot(X,W.T)#np.sign(np.dot(X,W.T))#感知器
??? W_C=lr*(Y-O.T).dot(X)/int(X.shape[0])#除以會縮小權(quán)值改變
??? W=W+W_C
for _ in range(1000):
??? update()#更新權(quán)值
???
?#收斂條件為迭代1000次后?
#正樣本
x1=[0,1]
y1=[1,0]
#負(fù)樣本
x2=[0,1]
y2=[0,1]
#計算函數(shù),最后畫圖呼奢,原理見圖片
def calculate(x,root):
??? a=W[5]
??? b=W[2]+x*W[4]
??? c=W[0]+x*W[1]+x*x*W[3]
??? if root==1:
??????? return (-b+np.sqrt(b*b-4*a*c))/(2*a)
??? if root==2:
??????? return (-b-np.sqrt(b*b-4*a*c))/(2*a)
???
xdata=np.linspace(-1,2)
plt.figure()
plt.plot(xdata,calculate(xdata,1),'r')
plt.plot(xdata,calculate(xdata,2),'r')
plt.plot(x1,y1,'bo')
plt.plot(x2,y2,'yo')
plt.show()
#輸出模型的值
O=np.dot(X,W.T)
print(O)
結(jié)果:
畫圖函數(shù)計算原理如下
?