1. 程式人生 > >機器學習之感知器——and運算的實現

機器學習之感知器——and運算的實現

概要:感知器是人工神經網路中的一種典型結構,它可以被視為一種最簡單形式的前饋式人工神經網路,是一種二元線性分類器,把矩陣上的輸入(實數值向量)對映到輸出值 f(x)上(一個二元的值)。

f(x)={1,0,if wx+b>0else
詳細介紹:下面是一個簡單的感知器:
這裡寫圖片描述
那麼感知器是由如下幾部分組成:
輸入 x 使用者的輸入(訓練的資料集)
輸入權值 w 對於每一個輸入,會有一個權值與之對應,用來控制結果
偏置項 b 就是上圖中的 w0
啟用函式 就是對應的 f(),比如說求一個 and 運算的啟用函式:f(x)
={1,0,if x>0else

輸出 y 感知器的輸出由如下公式推出 y=f(wx)+b
語言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]))