【1】引言
在前序學習進程中,我們已經了解了基本的二元分類器和神經元的構成,文章學習鏈接為:
神經網絡|(一)加權平均法,感知機和神經元-CSDN博客
在此基礎上,我們認識到神經元本身在做二元分類,是一種非此即彼的選擇。
由于不同的數據所占的權重不同,二元分類結果也一定收到權重的影響,為此,必須使用數學表達這種影響力。
在神經網絡相關研究的漫長發展進程中,研究范圍從單個因素到多個因素,必須關注無數的二元分類結果同時作用后獲得的最終分類結果,于是sigmoid()函數被提出。
【2】二元分類結果數學表達
認識感知機的二元分類本質,是研究sigmoid()函數的基礎。
這里先創造四個矩陣,這三個矩陣分別代表元素1,元素2,元素1和權重和元素2的權重。
import numpy as np #引入numpy模塊
import matplotlib.pyplot as plt #引入matplotlib模塊#創造矩陣
a = np.random.randint(5,9,size=(1,5)) #矩陣
b = np.random.randint(1,5,size=(1,5)) #矩陣
c = np.random.randn(1,5) #矩陣
d = np.random.randn(1,5) #矩陣
#閾值開關
k=1
#空矩陣
e =np.zeros((1,5),np.uint8) #用來存儲二元分類的計算結果
進行二元分類計算:
#二元分類計算
for i in range (5):if a[0,i]*c[0,i]+b[0,i]*d[0,i]-k>0: #閾值計算,滿足條件時取1,否則取0e[0,i]=1else:e[0,i]=0print('e[0,',i,']=',e[0,i]) #輸出閾值計算結果
繪制二元分類的效果:
#繪制二元分類計算的結果
print('a=',a) #輸出矩陣
print('b=',b) #輸出矩陣
print('c=',c) #輸出矩陣
print('d=',d) #輸出矩陣
x=np.arange(0,5,1) #定義一個自變量
plt.plot(x,e[0,x]) #對閾值計算結果繪圖
plt.savefig('ganzhiji.png') #保存圖像
plt.show() #輸出圖像
這里使用的閾值判斷函數為:
for i in range (5):if a[0,i]*c[0,i]+b[0,i]*d[0,i]-k>0: #閾值計算,滿足條件時取1,否則取0e[0,i]=1else:e[0,i]=0
代碼運行后的輸出圖像為:
圖1
圖1真實地反映了非此即彼的二元分類效果。
需要注意的是,由于元素的權重使用隨機數生成,所以每次運行上述程序,獲得的效果可能不一樣。
【3】sigmoid函數
實際上,二元分類效果可能不是兩個元素算一次就進行判斷,而是多個結果互相疊加在一起,也就是把閾值判斷函數改為:
f=0 #用來存儲二元分類的綜合計算結果 #二元分類計算 for i in range (5):if i==0:e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k # 閾值計算else:e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k+e[0,i-1] # 閾值計算 if e[0,4]>0: #最后計算結果,超過閾值開關取1,否則取0f=1 else:f=0
代碼運行后,獲得的輸出圖像為:
圖2
此時獲得的數據分別為:
圖3
由圖3可見,因為最后的e[0,4]>0,所以f=1。
此時的完整代碼為:
import numpy as np #引入numpy模塊
import matplotlib.pyplot as plt #引入matplotlib模塊#創造矩陣
a = np.random.randint(5,9,size=(1,5)) #矩陣
b = np.random.randint(1,5,size=(1,5)) #矩陣
c = np.random.randn(1,5) #矩陣
d = np.random.randn(1,5) #矩陣
#閾值開關
k=1
#空矩陣
e =np.zeros((1,5),np.uint8) #用來存儲二元分類的計算結果
f=0 #用來存儲二元分類的綜合計算結果
#二元分類計算
for i in range (5):if i==0:e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k # 閾值計算else:e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k+e[0,i-1] # 閾值計算
if e[0,4]>0: #最后計算結果,超過閾值開關取1,否則取0f=1
else:f=0#繪制二元分類計算的結果
print('a=',a) #輸出矩陣
print('b=',b) #輸出矩陣
print('c=',c) #輸出矩陣
print('d=',d) #輸出矩陣
print('e=',e) #輸出矩陣
print('f=',f) #輸出矩陣
x=np.arange(0,5,1) #定義一個自變量
plt.plot(x,e[0,x]) #對閾值計算結果繪圖
plt.savefig('ganzhiji.png') #保存圖像
plt.show() #輸出圖像
sigmoid()函數就是在上述基礎上,進一步優化函數表達式,把所有的加權計算結果變成指數函數的變量,并且指數函數還設置成分式的一部分。相應的,有如下函數:
如果把簡化為-x,該函數相應簡化為:
函數對應的圖像為:
圖4
圖4是平滑過渡圖像,并且輸出結果限定在(0,1)范圍內。
繪制圖4的代碼為:
import numpy as np #引入numpy模塊
import matplotlib.pyplot as plt #引入matplotlib模塊#創造矩陣
t=np.linspace(-10,10,100) #自變量
y0=np.exp(-t) #指數函數
y=1/(1+y0) #因變量
plt.plot(t,y) #繪制圖像
plt.title('sigmoid() function') #圖像上設置圖名
plt.savefig('sigmoid() function.png') #保存圖像
plt.show() #顯示圖像
【4】函數驗證
為驗證sigmoid()函數,可以在上述示例中的代碼plt.plot(x,e[0,x]) #對閾值計算結果繪圖
修改為:
plt.plot(x,1/(1+np.exp(-e[0,x]))) #對閾值計算結果繪圖
此時運行代碼獲得的圖像為:
圖5
由圖5可見,復雜多變的實際情況中,sigmoid()函數的輸出結果也是在(0,1)范圍內。所以,sigmoid()函數本身具有很強的實用性。
此時的完整代碼為:
import numpy as np #引入numpy模塊
import matplotlib.pyplot as plt #引入matplotlib模塊#創造矩陣
a = np.random.randint(5,9,size=(1,5)) #矩陣
b = np.random.randint(1,5,size=(1,5)) #矩陣
c = np.random.randn(1,5) #矩陣
d = np.random.randn(1,5) #矩陣
#閾值開關
k=1
#空矩陣
e =np.zeros((1,5),np.uint8) #用來存儲二元分類的計算結果
f=0 #用來存儲二元分類的綜合計算結果
#二元分類計算
for i in range (5):if i==0:e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k # 閾值計算else:e[0, i] = a[0, i] * c[0, i] + b[0, i] * d[0, i] - k+e[0,i-1] # 閾值計算
if e[0,4]>0: #最后計算結果,超過閾值開關取1,否則取0f=1
else:f=0#繪制二元分類計算的結果
print('a=',a) #輸出矩陣
print('b=',b) #輸出矩陣
print('c=',c) #輸出矩陣
print('d=',d) #輸出矩陣
print('e=',e) #輸出矩陣
print('f=',f) #輸出矩陣
x=np.arange(0,5,1) #定義一個自變量
plt.plot(x,1/(1+np.exp(-e[0,x]))) #對閾值計算結果繪圖
plt.savefig('sigmoid.png') #保存圖像
plt.show() #輸出圖像
需要注意的是,由于元素的權重使用隨機數生成,所以每次運行上述程序,獲得的效果可能不一樣。
【5】總結
探究了sigmoid()函數,研究了多因素的綜合作用。