使用Python來編寫乙個簡單的感知機

2022-09-02 04:03:16 字數 3482 閱讀 2968

眼下,我在hsr上參加了乙個神經網路和機器學習的課程,當中學習到乙個最簡單的神經網路模型。就是感知機(

perceptron

)。背景資料

最簡單的神經網路的模型就是感知機分類器,它有不同的輸入(x1, x2,......xn),然後有不同的權重值(

w1, w2,......wn),例如以下式計算:

每乙個相應的權重值與輸入值進行相乘,再相加在一起,然後通過乙個階梯函式f:

為了理解整個過程。以下就是它的簡化版本號的流程圖:

用python**來編寫

以下是使用python和

numpy

庫來編寫最簡單的感知機。它由兩個輸入值。接著使用它來學習布林運算

or的操作,第一步。先導入要使用的庫:

from random import choice

from numpy import array, dot, random

接著編寫階梯函式。把它的定義為unit_step:

unit_step = lambda x: 0 if x < 0 else 1

接著下來編寫輸入與輸出的對映關係的資料。使用numpy陣列來表示。第乙個元素是乙個三個元素的元組表示,而這個元組的前兩個值表示了兩個輸入值,第三個元素是表示偏差值(主要針對閾值計算),總是使用值

1來表示。第二個元素是表示期望輸出的值。

這個陣列定義例如以下:

training_data = [

(array([0,0,1]), 0),

(array([0,1,1]), 1),

(array([1,0,1]), 1),

(array([1,1,1]), 1),

從上訓練資料能夠看到布林運算子or的關係例如以下:

接著下來使用隨機函式來生成三個0和

1之間的權重值。作為初始化值:

w = random.rand(3)

到如今能夠宣告一些變數了,列表變數errors是儲存著誤差值,同一時候也為後面畫圖使用的,假設你不想畫圖,也沒有關係。就讓它這樣留著。變數

eta控制著學習速率,變數

n是定義了迭代學習多少遍:

errors =

eta = 0.2

n = 100

為了找到合適的權重值w。須要把誤差值減小到

0。在這個樣例裡,迭代

100次是足夠了,假設輸入是乙個很多雜訊的資料集,須要把這個迭代數量新增到更大的值。

首先為了訓練這個感知機。要生成隨機的資料集作為輸入。接著計算輸入值與權重值向量之間的點積運算。從而得到能夠與期望值進行比較的結果值。

假設期望值是比較大,須要把權重值新增,假設期望值是比較小,須要把權重值減小。

此校正因子計算在最後一行,當中的誤差乘以學習速率(eta)和輸入向量(x)

,再把這些權重值的誤差值加到權重值向量裡,這樣就能夠為了下一次的計算輸出值向更接最近望值的方向進行調整。

for i in xrange(n):

x, expected = choice(training_data)

result = dot(w, x)

error = expected - unit_step(result)

w += eta * error * x

所有基礎的**都編寫好了。接著下來就是訓練這個感知機,讓它來學習或操作:

for x, _ in training_data:

result = dot(x, w)

print("{}: {} -> {}".format(x[:2], result, unit_step(result)))

[0 0]: -0.0714566687173 -> 0

[0 1]: 0.829739696273 -> 1

[1 0]: 0.345454042997 -> 1

[1 1]: 1.24665040799 -> 1

假設對誤差值也感興趣。能夠採用視覺化的庫來顯示出來:

能夠從上圖看到,從第60次迭代就沒有誤差值了。假設你感覺這個誤差值。還不行,再計算小一些。能夠把訓練的次數改動為

500次,或者很多其它的次數:

另外,你也能夠動手把訓練資料改為學習布林運算and,nor或

not,只是。你要注意的一點。它不能模擬

xor運算。由於

xor運算不是線性可劃分的。假設你想模擬

xor運算必須使用多層的神經元感知機(基本上就是乙個小型的神經網路了)。

總結

所有**例如以下:

from random import choice 

from numpy import array, dot, random 

unit_step = lambda x: 0 if x < 0 else 1 

training_data = [ 

(array([0,0,1]), 0), 

(array([0,1,1]), 1), 

(array([1,0,1]), 1), 

(array([1,1,1]), 1), 

] w = random.rand(3) 

errors =  

eta = 0.2 

n = 100

for i in range(n): 

x, expected = choice(training_data) 

result = dot(w, x) 

error = expected - unit_step(result) 

w += eta * error * x 

for x, _ in training_data: 

result = dot(x, w) 

print("{}: {} -> {}".format(x[:2], result, unit_step(result)))

2. tensorflow入門基本教程

初識python,編寫乙個簡單的python程式

在ubuntu下安裝好了最新的python3.9,開啟學習python之旅。在命令列輸入python進入互動模式 互動模式下,你每輸入一行 python直譯器就將這一行 轉換成機器碼來執行。例如 互動模式輸入100 200,然後回車 直接會顯示執行結果300 但是這樣的 是沒有儲存的,如果下次我們還...

編寫乙個簡單的shell

include include include include include include include include void getloginname void gethostname void getdir p printf s p int main char argv 32 char...

OpenResty 簡單編寫乙個Module

使用 lua module 來進行 lua 的復用是推薦的做法。然後在使用者 中直接用require 來呼叫 module local mytest function mytest getid local str 123 return strend return mytest 開頭有這樣一行 mod...