感知器是神經網絡中的概念,是一個接受數個輸入,經過內部計算後得到輸出的模型,其模擬的是自然界的神經細胞:接受輸入信號的刺激,達到一定閾值後細胞體表現爲激發,否則爲抑制。
單層感知器
單層感知器最爲簡單,只有輸入層和輸出層,其計算規則爲:激發值爲輸入與權值的點積,若激發值大於某閾值則輸出1以代表激發,否則輸出-1代表抑制。
python代碼演示該模型:
class slp(object):
def __init__(self,num):
self.w = [0.0]*num
self.input = [0.0]*num
self.output = 0
def input(self,ilist):
if len(ilist) == len(self.input):
self.input = ilist
else:
print 'length error'
def calcu_result(self):
iszie = len(self.input)
res = sum([self.w[i]*self.input[i] for i in range(isize)])
if res > 0:
self.output = 1
else:
self.output = -1
這裏簡便起見以0爲閾值。
單層感知器可以實現簡單邏輯的判斷,但要求數據是線性可分的。對線性可分這個條件要求的原因在於其計算輸出的方法:
要實現對線性不可分數據的分類,需要使用多層感知器。
多層感知器
多層感知器與單層感知器相比,多了一層隱藏層,隱藏層對於輸入和輸出都是透明的。
def mlp(object):
def __init__(self,num):
self.in_floor = [slp(num)]*num
self.hide_floor = [slp(num)]*num
self.w = [0.0]*num
self.output = 0
def input(self,ilist):
if len(ilist) == len(self.in_floor):
for item in self.in_floor:
item.input(ilist)
else:
print 'length error'
def calcu_result(self):
in_for_hide = []
for item in self.in_floor:
item.calcu_result()
in_for_hide.append(item.output)
for item in self.hide_floor:
item.input(in_for_hide)
item.calcu_result()
iszie = len(self.hide_floor)
res = sum([self.w[i]*self.hide_floor[i].output for i in range(isize)])
if res > 0:
self.output = 1
else:
self.output = -1
可以看出,多層感知器是對單層感知器的擴展,輸入層到隱藏層就是多個單層感知器的組合,隱藏層各個節點的輸出又作爲輸入,組合爲輸出層的輸出。
注1:代碼中暫時未考慮權值的分配,權值的分配需要訓練算法。
注2:在代碼中以列表形式將輸入存入對象中,多層感知器中這樣做是低效的,會有大量的輸入數據冗餘。
參考資料:
http://blog.csdn.net/stan1989/article/details/8565499
http://blog.csdn.net/xiaowei_cqu/article/details/9004331