python 實現感知器(一)

2021-08-19 08:53:20 字數 3586 閱讀 3167

基礎知識不再重述,可參考

# -*- coding: utf-8 -*-

# 這裡定義乙個感知器的類

class

perceptron

(object):

def__init__

(self, input_num, activator):

''' 初始化感知器,設定輸入引數的個數,以及啟用函式。

啟用函式的型別為double -> double

'''self.activator = activator

# 權重向量初始化為0.0

self.weights = [0.0

for _ in range(input_num)]

# 偏置項初始化為0.0

self.bias = 0.0

def__str__

(self):

# __str__:類例項字串化函式

''' 列印學習到的權重、偏置項

'''return

'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)

defpredict

(self, input_vec):

''' 輸入向量,輸出感知器的計算結果

'''# 把input_vec[x1,x2,x3...]和weights[w1,w2,w3,...]打包在一起

# 變成[(x1,w1),(x2,w2),(x3,w3),...]

# 然後利用map函式計算[x1*w1, x2*w2, x3*w3]

# 最後利用reduce求和:reduce()還可以接收第3個可選引數,作為計算的初始值

xi_wi=map(lambda (x, w): x * w,zip(input_vec, self.weights))

# 啟用函式的輸入為w_1*x_1+w_2*x_2+bias

return self.activator(reduce(lambda a, b: a + b,xi_wi , 0.0) + self.bias)

deftrain

(self, input_vecs, labels, iteration, rate):

''' 輸入訓練資料:一組向量、與每個向量對應的label;以及訓練輪數、學習率

'''# 每次迭代都把所有的樣本輸入

for i in range(iteration):

self._one_iteration(input_vecs, labels, rate)

def_one_iteration

(self, input_vecs, labels, rate):

''' 一次迭代,把所有的訓練資料過一遍

'''# 把輸入和輸出打包在一起,成為樣本的列表[(input_vec, label), ...]

# 而每個訓練樣本是(input_vec, label)

samples = zip(input_vecs, labels)

# 對每個樣本,按照感知器規則更新權重

for (input_vec, label) in samples:

# 計算感知器在當前權重下的輸出

output = self.predict(input_vec)

# 更新權重

self._update_weights(input_vec, output, label, rate)

def_update_weights

(self, input_vec, output, label, rate):

''' 按照感知器規則更新權重

'''# 把input_vec[x1,x2,x3,...]和weights[w1,w2,w3,...]打包在一起

# 變成[(x1,w1),(x2,w2),(x3,w3),...]

# 然後利用感知器規則更新權重

delta = label - output

self.weights = map(lambda (x, w): w + rate * delta * x,

zip(input_vec, self.weights))

# 更新bias

self.bias += rate * delta

deff

(x):

''' 定義啟用函式f:階躍函式

'''return

1if x > 0

else

0def

get_training_dataset

():'''

基於and真值表構建訓練資料

'''# 構建訓練資料

# 輸入向量列表

input_vecs = [[1,1], [0,0], [1,0], [0,1]]

# 期望的輸出列表,注意要與輸入一一對應

# [1,1] -> 1, [0,0] -> 0, [1,0] -> 0, [0,1] -> 0

labels = [1, 0, 0, 0]

return input_vecs, labels

deftrain_and_perceptron

():'''

使用and真值表訓練感知器

'''# 建立感知器,輸入引數個數為2(因為and是二元函式),啟用函式為f

p = perceptron(2, f)

# 獲得標準的訓練資料

input_vecs, labels = get_training_dataset()

# 訓練,迭代10輪, 學習速率為0.1

p.train(input_vecs, labels, 10, 0.1)

#返回訓練好的感知器

return p

if __name__ == '__main__':

# 訓練and感知器

and_perception = train_and_perceptron()

# 列印訓練獲得的權重

print and_perception

# 測試

print

'1 and 1 = %d' % and_perception.predict([1, 1])

print

'0 and 0 = %d' % and_perception.predict([0, 0])

print

'1 and 0 = %d' % and_perception.predict([1, 0])

print

'0 and 1 = %d' % and_perception.predict([0, 1])

執行結果哦:

weights :[0.1, 0.2]

bias :-

0.200000

1and

1 = 1

0and

0 = 0

1and

0 = 0

0and

1 = 0

**已經有詳細的注釋,只需注意以下幾個地方就好。

通過這段簡單的**可以看出利用物件來實現演算法的乙個流程,自己在這方面還是相對薄弱,有待以後的學習和加強。

python原生實現感知器

具體理論詳盡分析請轉到我另一篇部落格 零基礎入門深度學習 6 原生實現長短時記憶網路 lstm python原生實現乙個感知器 實現and運算 將輸入標籤替換成or真值表對應結果,def gettraindataset and 真值表 inputs 0,0 0,1 1,0 1,1 and label...

感知器的scala實現

其實感知器學習演算法,就是利用第一節介紹的單層感知器。首先利用給的正確資料,計算得到輸出值,將輸出值和正確的值相比,由此來調整每乙個輸出端上的權值。公式便是用來調整權值,首先 是乙個 學習引數 一般我將它設定成小於1的正數。t便是訓練資料中的正確結果,便是第i個輸入端的輸入值,便是第i個輸入端上面的...

感知器的scala實現

其實感知器學習演算法,就是利用第一節介紹的單層感知器。首先利用給的正確資料,計算得到輸出值,將輸出值和正確的值相比,由此來調整每乙個輸出端上的權值。公式便是用來調整權值,首先 是乙個 學習引數 一般我將它設定成小於1的正數。t便是訓練資料中的正確結果,便是第i個輸入端的輸入值,便是第i個輸入端上面的...