魚書 第二章 感知機

2022-07-15 18:27:11 字數 4459 閱讀 7519

1.感知機

接收多個輸入訊號(x1,x2,......),輸出乙個訊號(y),w是權重,「○」稱為「神經元」神經元或者「節點」。

輸入訊號分別乘以固定的權重送入到神經元,神經元計算訊號的總和,當超過設定的某個界限時,輸出1,這也稱為「神經元被啟用」。其中,這個界限稱為閾值,用θ表示。

感知機的中的每個輸入訊號都有其固有的權重,權重越大,對應的訊號就越重要。

2.簡單的邏輯電路

2.1 用感知機實現與門

當輸入x1和x2都是1時,與門才輸出1,其他情況都是輸出0。那麼根據感知機的公式,需要確定的w1、w2、θ的值,從而實現與門。

實際上,滿足條件的(w1, w2, θ)有無數多個。比如,(w1, w2, θ) = (0.5, 0.5, 0.7)、(0.5, 0.5, 0.8)、(1.0, 1.0, 1.0)。

設定這樣的引數後,當且僅當x1 = x2 = 1時,訊號的加權總和才會超過給定的閾值θ。

與門的實現**如下:

import numpy as np

def and(x1, x2):

x = np.array([x1, x2])

w = np.array([0.5, 0.5])

b = -0.7

tmp = np.sum(w*x) + b

if tmp <= 0:

return 0

else:

return 1

if __name__ == '__main__':

for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:

y = and(xs[0], xs[1])

print(str(xs) + " -> " + str(y))

# (0, 0) -> 0

# (1, 0) -> 0

# (0, 1) -> 0

# (1, 1) -> 1

2.2 用感知機實現與非門

與非門跟與門恰恰相反,當輸入x1 = x2 = 1時,輸出為0,其他情況輸出1。那麼,把與門的引數值取反,作為與非門的引數即可。

與非門的實現**如下:

import numpy as np

def nand(x1, x2):

x = np.array([x1, x2])

w = np.array([-0.5, -0.5])

b = 0.7

tmp = np.sum(w*x) + b

if tmp <= 0:

return 0

else:

return 1

if __name__ == '__main__':

for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:

y = nand(xs[0], xs[1])

print(str(xs) + " -> " + str(y))

# (0, 0) -> 1

# (1, 0) -> 1

# (0, 1) -> 1

# (1, 1) -> 0

2.3 用感知機實現或門

只要輸入的x1、x2其中乙個為1,或門輸出即為1。

滿足條件的(w1, w2, θ)同樣有無數多個。比如,(w1, w2, θ) = (0.5, 0.5, 0.3)、(0.5, 0.5, 0.4)、(1.0, 1.0, 0.5)

或門的實現**如下:

import numpy as np

def or(x1, x2):

x = np.array([x1, x2])

w = np.array([0.5, 0.5])

b = -0.2

tmp = np.sum(w*x) + b

if tmp <= 0:

return 0

else:

return 1

if __name__ == '__main__':

for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:

y = or(xs[0], xs[1])

print(str(xs) + " -> " + str(y))

# (0, 0) -> 0

# (1, 0) -> 1

# (0, 1) -> 1

# (1, 1) -> 1

2.4 用感知機實現異或門

異或門的原理:僅當x1或x2中的一方為1時,才會輸出1

然而異或門不能用前面的感知機來實現。為什麼與門、或門,與非門都能實現,卻無法實現異或門?畫個圖就知道了。其中○表示0,△表示1。

感知機會生成乙個線性函式將或門的輸出分成兩個部分,乙個部分是0,乙個部分是1。然而,感知機生成的線性函式不能將異或門的輸出分成兩個部分,只能用非線性函式進行分割。而這正是感知機的侷限:只能表示由一條直線分割的空間。

通過這個例子就引出單層感知機不能表示異或門,但是疊加了多層的感知機就能表示了。

異或門是一種多層結構的神經網路。將最左邊的一列稱為第0層,中間的一列稱為第1層,最右邊的一列稱為第2層。疊加了多層的感知機稱為多層感知機。

該神經網路的執行步驟如下:

1.第0層的神經元接收輸入訊號,經過引數處理後,將訊號輸出給第1層神經元。

2.第1層的神經元將第0層的輸出訊號作為這一層的輸入訊號,經過引數處理後,將其輸出給第2層的神經元。

3.第2層的神經元將第1層的輸出訊號作為這一層的輸入訊號,經過引數處理後,輸出y。

異或門的實現**如下:

from and_gate import and

from or_gate import or

from nand_gate import nand

def xor(x1, x2):

s1 = nand(x1, x2)

s2 = or(x1, x2)

y = and(s1, s2)

return y

if __name__ == '__main__':

for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:

y = xor(xs[0], xs[1])

print(str(xs) + " -> " + str(y))

# (0, 0) -> 0

# (1, 0) -> 1

# (0, 1) -> 1

# (1, 1) -> 0

3.看完第二章要記住的一句話:

感知機通過疊加層可以表示非線性。

4.魚書**:

第二章 感知機

感知機 是根據輸入例項的特徵向量x 對其進行二類分類的線性分類模型 f x sign w,x b 感知機對應於輸入空間的分離超平面wx b 0 學習策略是極小化損失函式 損失函式對應於誤分類點到分離超平面的總距離 學習演算法是基於隨機梯度下降法的對損失函式的最優化演算法 有原始形式和對偶形式,演算法...

第二章 感知機

目錄感知機的演算法 begin sign x left 1 x geq 0 1 x 0 end right.end 假設空間 存在超平面 w cdot x b 0 使得正負樣例在超平面兩側 資料集線性可分的充分必要條件是,正負例項點所構成的凸殼互不相交 conv s lambda i x i sum...

第二章 感知機的python實現

這裡是我的個人 本來想寫乙個關於感知機的總結,但如果要深入 涉及的東西實在太多。僅僅淺嘗輒止的話,那我就相當於照搬原文,違背了我寫文章的初衷。所以就單純地把我自己寫的感知機實現 發上來,輔助大家學習。我還提供了乙個資料生成器,可以生成訓練模型所需要的資料。簡單地對結果做了視覺化,具體繪製 見文末提供...