機器學習筆記--實現簡單的神經網絡

編譯環境使用的是anaconda,應用的是python語言

軟件包的下載:https://mirrors.tuna.tsinghua.edu.cn/

安裝後進入:

Environment-->root-->open with Jupyter NoteBook-->彈出網頁-->new-->python

然後進行代碼編寫(代碼是根據教學視頻中的代碼給出的)

import numpy as np
class Perceptron(object): 
        """
            實現感知器的類
            eta:學習率
            n_iter:權重向量的訓練次數
            w_:神經分叉權重向量
            errors_:用於記錄神經元判斷出錯次數
            def _int:爲初始化函數
        """
    def _int_(self, eta = 0.01, n_iter=10):
        self.eta=eta;
        self.n_iter=n_iter
        pass
    def fit(self,X,y):
            """
               1.fit方法是爲輸入訓練數據,培訓神經元
               2.其中X是電信號向量,即輸入樣本向量
               3.y:每一個樣本所屬於的分類
               4.每一個X都有一個shape屬性,是對X向量的描述
                 X:shape(n_samples,n_features)
                 其中n_samples是指X中有多少個輸入的樣本量
                 n_features這個分叉輸入的電信號有多少個,比如神經元有三個分叉,則這個神經元
                 可以接受三個輸入電信號
                 eg:x:[[1,2,3],[4,5,6]]
                  n_samples:2
                  n_features:3
                  y:[1,-1]表示[1,2,3]屬於分類1,[4,5,6]屬於分類-1
                1.初始化權重向量爲0
                2.np.zero:數學庫,初始化分量全是0的一個向量
                3.其中X.shape[1]爲X.shape中的n_samples的值即爲2
                4.爲什麼np.zero中要+1,是對應閾值中的對應的w0,(步調函數的閾值)
                5.self.errors_表示記錄錯誤的次數
            """
        self.w_=np.zero(1+X.shape[1]);
        self.errors_=[]
        
                """
                    進入訓練的過程,訓練n_iter,如果嘗試了n_iter次都是錯誤的,則終止訓練
                """
        for _ in range(self.n_iter):
            errors=0
                """
                    1. X:[[1,2,3],[4,5,6]] y:[1,-1]
                    2.zip(X,y) = [[1,2,3,1],[4,5,6,-1]]
                    3.for中運用權值更新算法
                      update=η*(y-y'),η是學習率,y是電信號的向量分類,y'是計算出來的分類
                      y'是對應predict所調用出來的結果
                """
            for xi,target in zip(X,y):
                update = self.eta * (target - self.predict(xi))
                
                    """
                        1.xi是向量,update是常量
                          update * xi等價於:
                          ▽w(1)=X[1]*update,▽w(2)=X[2]*update,▽w(3)=X[3]*update
                          self.w[1:] +=等價於:
                          把原來的權重分量全部加上增加的分量▽w(1),▽w(2),▽w(3)
                          self.w[1:]等價於
                          是從1開始,忽略0元素,即忽略掉0
                          這樣就可以更新每一個神經分叉進行更新
                    """
                self.w[1:] += update * xi
                """
                更新閾值w0,然後統計判斷錯誤的次數,如果錯誤次數越來越少,學習效果
                    越來越好,對新數據的判斷越來越準確
                    如果判斷正確,則y-y'=0,則target - self.predict(xi)=0
                """
                self.w_[0] += update;
                errors += int(update !=0.0)
                self.errors_.append(errors)
                 pass
            
             pass
                """
                    1.當神經元接受信號的時候會將接受的數據弱化,通過向量的點積運算來進行弱化
                    2.np.dot做點積,其中權重向量就是進行弱化的那個向量
                    3.z=w0*1+w1*x1+w2*x2+...+xn*wn
                    如果z<0則輸入的x屬於電信號-1
                """
    def net_input(self,X):
        
         return np.dot(X,self.w_[1:])+self.w_[0]   
        pass
    
    def predict(self,X):
        return np.where(self.net_input(X) >= 0.0 , 1,-1)
        pass
    pass


附上不帶註釋的:

import numpy as np
class Perceptron(object): 
    def _int_(self, eta = 0.01, n_iter=10):
        self.eta=eta;
        self.n_iter=n_iter
        pass
    def fit(self,X,y):
        self.w_=np.zero(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)
                pass 
            pass
        def net_input(self,X):
            return np.dot(X,self.w_[1:])+self.w_[0]
            pass
        def predict(self,X):
            return np.where(self.net_input(X) >= 0.0 , 1,-1)
            pass     
        pass


以上代碼是構建神經元的學習基本模型

通過將大量數據給學習模型,讓學習模型通過對大量數據進行觀察總結出相應規律

根據數據的特點不斷的調節神經元的權重數值,當神經元的權重數值調節到合適範圍之後,就可以利用訓練後的模型

去對新的數據進行運算,通過運算結果就能準確對新的數據進行分類和預測

pandas是python中的提供的非常強大的數據讀取類庫
header=None是因爲csv數據中第一行往往不是一個數據,往往是用來說明下面一些數據的信息的,但代碼中file中第一行就是數據,所以設置文件頭爲None

file = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
import pandas as pd
df = pd.read_csv(file,header=None)
df.head(10)

運行結果:


關於CSV文件問題:(該段摘自某網友的回答)

file = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
import pandas as pd
df = pd.read_csv(file,header=None)
df.head(10)
1.網址是文件的原地址,數據是可以直接從網址上拔下來的。
2.如果運行以上代碼csv的文件,網站只能下載txt需要下載txt後轉化成csv。
以上運行結果一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章