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

來源:互聯網
上載者:User

標籤:cli   add   sql資料庫   video   多少   flow   模型   表示   它的   

https://blog.dbrgn.ch/2013/3/26/perceptrons-in-python/

 

目前,我在HSR上參加了一個神經網路和機器學習的課程,其中學習到一個最簡單的神經網路模型,就是感知機(perceptronperceptronperceptron)。

 

背景資料

最簡單的神經網路的模型就是感知機分類器,它有不同的輸入(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

http://reference.wolfram.com/language/ref/UnitStep.html

接著下來編寫輸入與輸出的映射關係的資料,使用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)

errors.append(error)

 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

如果對誤差值也感興趣,可以採用可視化的庫來顯示出來:

from pylab import plot, ylim

ylim([-1,1])

plot(errors)


可以從看到,從第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 = 100for i in range(n):     x, expected = choice(training_data)     result = dot(w, x)     error = expected - unit_step(result)     errors.append(error)     w += eta * error * x     for x, _ in training_data:     result = dot(x, w)     print("{}: {} -> {}".format(x[:2], result, unit_step(result)))

1. TensorFlow API攻略http://edu.csdn.net/course/detail/4495
2. TensorFlow入門基本教程http://edu.csdn.net/course/detail/4369
3. C++標準模板庫從入門到精通 
http://edu.csdn.net/course/detail/3324
4.跟老菜鳥學C++
http://edu.csdn.net/course/detail/29015. 跟老菜鳥學pythonhttp://edu.csdn.net/course/detail/25926. 在VC2015裡學會使用tinyxml庫http://edu.csdn.net/course/detail/25907. 在Windows下SVN的版本管理與實戰  http://edu.csdn.net/course/detail/25798.Visual Studio 2015開發C++程式的基本使用 http://edu.csdn.net/course/detail/25709.在VC2015裡使用protobuf協議http://edu.csdn.net/course/detail/258210.在VC2015裡學會使用MySQL資料庫
http://edu.csdn.net/course/detail/2672

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.