感知器及其Python實現


  感知器是由美國計算機科學家羅森布拉特(F.Roseblatt)於1957年提出的。感知器可謂是最早的人工神經網絡。單層感知器是一個具有一層神經元、采用閾值激活函數的前向網絡。通過對網絡權值的訓練,可以使感知器對一組輸人矢量的響應達到元素為0或1的目標輸出,從而實現對輸人矢量分類的目的。

  下圖是一個感知器:

 

可以看到,一個感知器有如下組成部分:

01 輸入權值:

  其中,每一個輸入分量Xj(j=1,2…,r)通過一個權值分量wj,進行加權求和,並作為閾值函數的輸人。偏差 的加入(對應上圖中的 w0 ,這樣是便於書寫和理解)使得網絡多了一個可調參數,為使網絡輸出達到期望的目標矢量提供了方便。感知器特別適合解決簡單的模式分類問題。

 

02 激活函數:

  激活函數則有較多的選擇,較為常見的有sigmoid函數和階躍函數,這里以階躍函數為例!

 

03 輸出:

  感知器的輸出則由如下公式計算得出:

 

  感知器有個屌用呢?F.Roseblatt 已經證明,如果兩類模式是線性可分的(指存在一個超平面將它們分開),則算法一定收斂。

  舉個例子:很多的呀,比如最簡單的的布爾運算。可以看作是二分類問題,即給定一個輸入,輸出0(屬於分類0)或1(屬於分類1)。它還可以擬合任何的線性函數,任何線性分類或線性回歸問題都可以用感知器來解決。給你講講感知器的訓練過程吧!

 

  利用下面的感知器規則迭代的修改參數直到訓練完成。

 

  其中,

 

  Wi是與輸入Xi應的權重項,偏置項。事實上,可以把 b 看作是值永遠為 1 的輸入Xb對應的權重。是訓練樣本的實際值,一般稱之為 label。而 y 感知器的輸出值,它是根據公式計算得出。η 一個稱為學習速率的常數,其作用是控制每一步調整權的幅度。

 

  每次從訓練數據中取出一個樣本的輸入向量 x ,使用感知器計算其輸出 y,再根據上面的規則來調整權重。每處理一個樣本就調整一次權重。經過多輪迭代后(即全部的訓練數據被反復處理多輪),就可以訓練出感知器的權重,使之實現目標函數。

 

  下邊是根據感知器算法編寫出的python代碼實現:(實踐時是利用一個鳶尾花數據集archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data)

class Perceptron():
    """
    eta: learning rate(0.0-1.0)
    n_iter:passes over the traing dataset
    w_:weights after fitting
    errors_:number of misclassifications in every epoch
    """
    def __init__(self,eta=1,n_iter=10):
        self.eta = eta
        self.n_iter = n_iter
    def fit(self,X,y):
        """fit training data."""
        self.w_ = np.zeros(1 + X.shape[1])
        self.errors_ = []
        for _ in range(self.n_iter):
            errors = 0
            for xi,target in zip(X,y):
                update = self.eta * (target - self.predict(xi))
                self.w_[1:] += update * xi
                self.w_[0] += update
                errors += int(update != 0.0)
            self.errors_.append(errors)
        return self
    def net_input(self,X):
        """caculate net input"""
        return np.dot(X,self.w_[1:]) + self.w_[0]
        #a.dot(b)   np.dot(a,b)    sum(i*j for i,j in zip(a,b))
    def predict(self,X):
        """return class label after unit step"""
        return np.where(self.net_input(X) >= 0.0, 1, -1)

   搭配上必要的繪圖模塊,可以實現對鳶尾花種類的識別,這里只是對感知器進行介紹,就不過多敘述其他模塊了

 

摘自:https://mp.weixin.qq.com/s/o1OJRPRWCbTwk7dhZgjeHg

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM