機器學習之感知器——and運算的實現
阿新 • • 發佈:2019-01-27
概要:感知器是人工神經網路中的一種典型結構,它可以被視為一種最簡單形式的前饋式人工神經網路,是一種二元線性分類器,把矩陣上的輸入(實數值向量)對映到輸出值
詳細介紹:下面是一個簡單的感知器:
那麼感知器是由如下幾部分組成:
輸入 x 使用者的輸入(訓練的資料集)
輸入權值 w 對於每一個輸入,會有一個權值與之對應,用來控制結果
偏置項 b 就是上圖中的
啟用函式 就是對應的
輸出 y 感知器的輸出由如下公式推出
語言:Python3
參考:@hanbingtao
用感知器實現 and 函式
程式碼:
class Perceptron(object):
def __init__(self, num, activator):
'''
初始化感知器,設定輸入引數的個數,以及啟用函式。
啟用函式的型別為double -> double
'''
self.activator = activator
#權重向量初始化為 0
self.weights = [0.0 for _ in range(num)]
self.bias = 0
def __str__(self):
'''
列印學習到的權重、偏置項bias
'''
return 'weight: %s\n bias: %f\n' % (self.weights, self.bias)
def predict(self, input_vec):
'''
輸入向量,輸出感知器的計算結果
'''
# 利用map函式計算[x1*w1, x2*w2, x3*w3], 然後轉化為列表
# 最後利用 sum 求和
return self.activator(
sum(
list(
map(
lambda x, y: x*y,
self.weights, input_vec
)
)
)
+ self.bias
)
#return self.activator(sum(tmp))
def train(self, input_vecs, labels, iterations, rate):
'''
輸入訓練資料:一組向量、與每個向量對應的label;以及訓練輪數、學習率
'''
for _ in range(iterations):
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):
''''
按照感知器規則,更新權重
'''
delta = label - output
self.weights = list(
map(
lambda x, y: x + y*rate*delta,
self.weights, input_vec
)
)
self.bias += rate * delta
''''
以下程式碼為實現 and 函式
'''
def activate(x):
if x > 0:
return 1
return 0
def get_train_dataset():
#構建訓練資料
input_vecs = [ [0, 0], [0, 1], [1, 0], [1, 1] ] #訓練資料
labels = [0, 0, 0, 1] #輸出列表
return input_vecs, labels
def train_data():
# 建立一個感知器
perceptron = Perceptron(2, activate)
input_vecs, labels = get_train_dataset()
# 訓練資料,然後迭代 20 輪,學習速率為 0.1
perceptron.train(input_vecs, labels, 20, 0.1)
return perceptron
result = train_data()
print(result)
#測試真值表
print('1 and 1 = %d' % result.predict([1, 1]))
print('0 and 0 = %d' % result.predict([0, 0]))
print('1 and 0 = %d' % result.predict([1, 0]))
print('0 and 1 = %d' % result.predict([0, 1]))