Python實戰演練之python實現神經網絡模型算法

?

?

python實現神經網絡模型算法

8c107be3a5da79c3f15a4b22afc8e73a.gif

?

?

acb8949c713f12abbc5595bd5ef39b01.gif

今天,厾羅和大家分享用Python實現神經網絡模型算法,僅用于技術學習交流。

?

9292b07fdf90bd2f5f88b933b7ca44f1.png

實現技巧

?

1.導入依賴庫

主要是安裝相關的依賴庫。本文實現的環境為:python 3.7。


from __future__ import division    
import math      
import random    
import pandas as pd  

2.構建BP神經網絡類

主要是構建三層反向傳播神經網絡類。


""" 三層反向傳播神經網絡 """
class NN:def __init__(self, ni, nh, no):self.ni = ni + 1                            # 輸入層節點self.nh = nh + 1                    # 隱藏層節點self.no = no                      # 輸出層種類self.ai = [1.0] * self.ni    self.ah = [1.0] * self.nh    self.ao = [1.0] * self.no    self.wi = self.makeMatrix(self.ni, self.nh)  # 輸出層到隱藏層的映射矩陣self.wo = self.makeMatrix(self.nh, self.no)  # 隱藏層到輸出層的映射矩陣for i in range(self.ni):          for j in range(self.nh):    self.wi[i][j] = self.rand(-0.2, 0.2)  for j in range(self.nh):for k in range(self.no):self.wo[j][k] = self.rand(-2, 2)  #前向傳播,激活神經網絡的所有節點def update(self, inputs):if len(inputs) != self.ni - 1:print(len(inputs),self.ni - 1)raise ValueError('與輸入層節點數不符!')    for i in range(self.ni - 1):    self.ai[i] = inputs[i]    for j in range(self.nh):                  # self.nh表示隱藏層的節點數sum = 0.0                            # 激活項a = g(z)  z = Θ^T x ;sum相當于z,每次循環歸零for i in range(self.ni):                  #通過循環z = Θ^T x ,因為Θ、x均為向量sum = sum + self.ai[i] * self.wi[i][j]  #〖 Z〗^((2))=Θ^((1)) a^((1))self.ah[j] = self.sigmoid(sum)    # a^((2))=g(z^((2))),這里使用sigmoid()函數作為激活函數for k in range(self.no):sum = 0.0for j in range(self.nh):sum = sum + self.ah[j] * self.wo[j][k]  #〖 Z〗^((3))=Θ^((2)) a^((2))self.ao[k] = self.sigmoid(sum)    # a^((3))=g(z^((3)))return self.ao[:]#反向傳播,計算節點激活項的誤差def backPropagate(self, targets, lr):               # targets為某樣本實際種類分類,lr為梯度下降算法的學習率output_deltas = [0.0] * self.nofor k in range(self.no):error = targets[k] - np.round_(self.ao[k])output_deltas[k] = self.dsigmoid(self.ao[k]) * error# 計算隱藏層的誤差hidden_deltas = [0.0] * self.nh    for j in range(self.nh):error = 0.0for k in range(self.no):error = error + output_deltas[k] * self.wo[j][k]    hidden_deltas[j] = self.dsigmoid(self.ah[j]) * error# 更新輸出層權重for j in range(self.nh):            # 反向傳播算法,求出每個節點的誤差后,反向更新權重for k in range(self.no):change = output_deltas[k] * self.ah[j]    self.wo[j][k] = self.wo[j][k] + lr * change   # 更新輸入層權重for i in range(self.ni):                    for j in range(self.nh):change = hidden_deltas[j] * self.ai[i]self.wi[i][j] = self.wi[i][j] + lr * change# 計算誤差error = 0.0for k in range(self.no):                                    error += 0.5 * (targets[k] - np.round_(self.ao[k])) ** 2  return error                                          #用測試集輸出準確率def test(self, patterns):                            count = 0num=0for p in patterns:target = p[1]result = self.update(p[0])                    print(p[0], ':', target, '->', np.round_(result))num=0for k in range(self.no):if (target[k] == np.round_(result[k])):num +=1print(num)if num==3:count +=1print("******************",(target) == (np.round_(result)),"******************")accuracy = int(float(count / len(patterns))*100)print('accuracy: %-.9f' % accuracy,"%")      #輸出訓練過后神經網絡的權重矩陣def weights(self):print('輸入層權重:')for i in range(self.ni):print(self.wi[i])print()print('輸出層權重:')for j in range(self.nh):print(self.wo[j])#用訓練集訓練神經網絡def train(self, patterns, iterations=1000, lr=0.1):  for i in range(iterations):error = 0.0                    for p in patterns:            inputs = p[0]            targets = p[1]            self.update(inputs)          error = error + self.backPropagate(targets, lr)  if i % 100 == 0:print("percent:",int(i/iterations*100),"%",'   error: %-.9f' % error)#生成區間[a, b)內的隨機數def rand(self, a, b):    return (b - a) * random.random() + a    # 生成大小 I*J 的矩陣,默認零矩陣def makeMatrix(self, I, J, fill=0.0):    m = []    for i in range(I):    m.append([fill] * J)    return m   # 函數 sigmoid,bp神經網絡前向傳播的激活函數def sigmoid(self, x):return 1.0 / (1.0 + math.exp(-x))       # 函數 sigmoid 的導數,反向傳播時使用def dsigmoid(self, x):return x * (1 - x)

3.讀取數據并進行預處理

主要是讀取構建分類模型的數據,并進行預處理。

  data = []                            raw = pd.read_csv('iris.csv')    raw_data = raw.values            raw_feature = raw_data[1:, 1:5]    for i in range(len(raw_feature)):          ele = []                    ele.append(list(raw_feature[i]))  if raw_data[i][5] == 0:   ele.append([0, 0,1])    elif raw_data[i][5] == 1:ele.append([0,1, 0])elif raw_data[i][5] == 2:ele.append([1, 1,1])else:ele.append([0, 0,0])data.append(ele)

4.利用構建的BP神經網絡預測類,創建神經網絡模型

主要是用BP神經網絡預測類創建神經網絡類模型。

  nn = NN(4, 10, 3)  

5.BP分類模型訓練及預測

主要是劃分訓練集和測試集,并進行BP分類模型訓練和預測。

   training = data[1:100]            test = data[101:]            nn.train(training, iterations=1000)  nn.test(test) 

完整源代碼


from __future__ import division    
import math      
import random    
import pandas as pd    
import numpy as np""" 三層反向傳播神經網絡 """
class NN:def __init__(self, ni, nh, no):self.ni = ni + 1                            # 輸入層節點self.nh = nh + 1                    # 隱藏層節點self.no = no                      # 輸出層種類self.ai = [1.0] * self.ni    self.ah = [1.0] * self.nh    self.ao = [1.0] * self.no    self.wi = self.makeMatrix(self.ni, self.nh)  # 輸出層到隱藏層的映射矩陣self.wo = self.makeMatrix(self.nh, self.no)  # 隱藏層到輸出層的映射矩陣for i in range(self.ni):          for j in range(self.nh):    self.wi[i][j] = self.rand(-0.2, 0.2)  for j in range(self.nh):for k in range(self.no):self.wo[j][k] = self.rand(-2, 2)  #前向傳播,激活神經網絡的所有節點def update(self, inputs):if len(inputs) != self.ni - 1:print(len(inputs),self.ni - 1)raise ValueError('與輸入層節點數不符!')    for i in range(self.ni - 1):    self.ai[i] = inputs[i]    for j in range(self.nh):                  # self.nh表示隱藏層的節點數sum = 0.0                            # 激活項a = g(z)  z = Θ^T x ;sum相當于z,每次循環歸零for i in range(self.ni):                  #通過循環z = Θ^T x ,因為Θ、x均為向量sum = sum + self.ai[i] * self.wi[i][j]  #〖 Z〗^((2))=Θ^((1)) a^((1))self.ah[j] = self.sigmoid(sum)    # a^((2))=g(z^((2))),這里使用sigmoid()函數作為激活函數for k in range(self.no):sum = 0.0for j in range(self.nh):sum = sum + self.ah[j] * self.wo[j][k]  #〖 Z〗^((3))=Θ^((2)) a^((2))self.ao[k] = self.sigmoid(sum)    # a^((3))=g(z^((3)))return self.ao[:]#反向傳播,計算節點激活項的誤差def backPropagate(self, targets, lr):               # targets為某樣本實際種類分類,lr為梯度下降算法的學習率output_deltas = [0.0] * self.nofor k in range(self.no):error = targets[k] - np.round_(self.ao[k])output_deltas[k] = self.dsigmoid(self.ao[k]) * error# 計算隱藏層的誤差hidden_deltas = [0.0] * self.nh    for j in range(self.nh):error = 0.0for k in range(self.no):error = error + output_deltas[k] * self.wo[j][k]    hidden_deltas[j] = self.dsigmoid(self.ah[j]) * error# 更新輸出層權重for j in range(self.nh):            # 反向傳播算法,求出每個節點的誤差后,反向更新權重for k in range(self.no):change = output_deltas[k] * self.ah[j]    self.wo[j][k] = self.wo[j][k] + lr * change   # 更新輸入層權重for i in range(self.ni):                    for j in range(self.nh):change = hidden_deltas[j] * self.ai[i]self.wi[i][j] = self.wi[i][j] + lr * change# 計算誤差error = 0.0for k in range(self.no):                                    error += 0.5 * (targets[k] - np.round_(self.ao[k])) ** 2  return error                                          #用測試集輸出準確率def test(self, patterns):                            count = 0num=0for p in patterns:target = p[1]result = self.update(p[0])                    print(p[0], ':', target, '->', np.round_(result))num=0for k in range(self.no):if (target[k] == np.round_(result[k])):num +=1print(num)if num==3:count +=1print("******************",(target) == (np.round_(result)),"******************")accuracy = int(float(count / len(patterns))*100)print('accuracy: %-.9f' % accuracy,"%")      #輸出訓練過后神經網絡的權重矩陣def weights(self):print('輸入層權重:')for i in range(self.ni):print(self.wi[i])print()print('輸出層權重:')for j in range(self.nh):print(self.wo[j])#用訓練集訓練神經網絡def train(self, patterns, iterations=1000, lr=0.1):  for i in range(iterations):error = 0.0                    for p in patterns:            inputs = p[0]            targets = p[1]            self.update(inputs)          error = error + self.backPropagate(targets, lr)  if i % 100 == 0:print("percent:",int(i/iterations*100),"%",'   error: %-.9f' % error)#生成區間[a, b)內的隨機數def rand(self, a, b):    return (b - a) * random.random() + a    # 生成大小 I*J 的矩陣,默認零矩陣def makeMatrix(self, I, J, fill=0.0):    m = []    for i in range(I):    m.append([fill] * J)    return m   # 函數 sigmoid,bp神經網絡前向傳播的激活函數def sigmoid(self, x):return 1.0 / (1.0 + math.exp(-x))       # 函數 sigmoid 的導數,反向傳播時使用def dsigmoid(self, x):return x * (1 - x)if __name__ == '__main__':data = []                            raw = pd.read_csv('iris.csv')    raw_data = raw.values            raw_feature = raw_data[1:, 1:5]    for i in range(len(raw_feature)):          ele = []                    ele.append(list(raw_feature[i]))  if raw_data[i][5] == 0:   ele.append([0, 0,1])    elif raw_data[i][5] == 1:ele.append([0,1, 0])elif raw_data[i][5] == 2:ele.append([1, 1,1])else:ele.append([0, 0,0])data.append(ele)nn = NN(4, 10, 3)  training = data[1:100]            test = data[101:]            nn.train(training, iterations=1000)  nn.test(test)

?

79d7d1c71775053c3238c743bb761f6e.gif

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210919.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210919.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210919.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言聯合體

聯合體 聯合體聯合體基本概念聯合體特點聯合體內存結構圖 聯合體 聯合體基本概念 聯合體概念: 結構體(struct)是一種結構體類型或者復雜類型,它可以包含多個類型不同的成員另外一種和結構體非常類似的類型,叫做聯合…

GPT-4 變懶了?官方回復

你是否注意到,最近使用 ChatGPT 的時候,當你向它提出一些問題,卻得到的回應似乎變得簡短而敷衍了?對于這一現象,ChatGPT 官方給出了回應。 譯文:我們聽到了你們所有關于 GPT4 變得更懶的反饋!我…

在HTML中插入音頻和視頻(詳解)

Hi i,m JinXiang ? 前言 ? 本篇文章主要介紹在HTML中插入音頻和視頻以及部分理論知識 🍉歡迎點贊 👍 收藏 ?留言評論 📝私信必回喲😁 🍉博主收將持續更新學習記錄獲,友友們有任何問題可以在評論區留言 …

外匯交易中的MT4軟件優勢:解析軟件對交易的影響!

近年來,隨著金融科技的不斷發展,MT4軟件作為外匯交易領域的領先平臺,備受交易者青睞。本文將探討MT4軟件在外匯交易中的優勢以及對交易的影響,幫助讀者深入了解這一交易利器。 ### 1. MT4軟件概述 MetaTrader 4(簡稱MT4)是一款由M…

深度學習 時間序列回歸學習筆記

目錄 常用的深度學習時間序列回歸模型: ARIMA模型 ETS模型 效果評估

低多邊形3D建模動畫風格紋理貼圖

在線工具推薦: 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時,有幾種不同的風格&#xf…

【Linux】make/Makefile --- 自動化構建項目的工具

目錄 一、make/Makefile的簡單使用 二、Makefile 的語法規則 三、實現的原理 3.1 make/Makefile識別文件新舊 3.2 .PHONY修飾的偽目標總是被執行 3.3 make/Makefile是具有依賴性的推導能力的 四、語法技巧 五、注意事項 Linux中自動化構建項目最簡單的方式:…

python樂觀鎖和悲觀鎖

在并發編程中,鎖是一種常用的機制,用于保護共享資源的訪問。樂觀鎖和悲觀鎖是兩種不同的鎖機制。 樂觀鎖:不會一開始就加鎖,在更新的時候,判斷一下在此期間別人是否修改了數據,若修改了不執行此操作&#…

軟件質量:建立信心的十大指標

. Bug 數量——可能按優先級或嚴重性排列 一般來說,錯誤的數量會在項目生命周期的中期開始增加。在截止日期之前的幾天或幾周(取決于項目的規模),團隊將集中精力減少 bug 的數量,直到 bug 的數量達到某種漸近線。這個漸…

Nginx基礎篇:Nginx搭建、Nginx反向代理、文件服務器部署配置。

Nginx Linux系統安裝以及反向代理的配置 簡介優點nginx 環境安裝常用Nginx 命令nginx 文件服務器搭建 簡介 Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點…

如何把kubernetes pod中的文件拷貝到宿主機上或者把宿主機上文件拷貝到kubernetes pod中

1. 創建一個 Kubernetes Pod 首先&#xff0c;下面是一個示例Pod的定義文件&#xff08;pod.yaml&#xff09;&#xff1a; cat > nginx.yaml << EOF apiVersion: v1 kind: Pod metadata:name: my-nginx spec:containers:- name: nginximage: nginx EOF kubectl app…

LabelImg的使用及注意事項

LabelImg是一款開源的圖像標注工具&#xff0c;它主要用于標注目標檢測、語義分割和圖像分類等深度學習中需要的數據集。通過使用LabelImg&#xff0c;用戶可以快速、準確地為圖片中的目標添加標注信息&#xff0c;從而建立數據集。 使用步驟&#xff1a; 下載LabelImg&#x…

java測試rtsp地址連接狀態,測試RTSP連接狀態是否成功,java如何測試rtsp地址連接是否成功

import java.net.Socket; import java.net.URI; import java.net.URISyntaxException;/*** ClassName: RTSPUtils* Description: 測試RTSP連接狀態* Author: zhanghui* Date: 2023-12-08* Version: 1.0**/ public class RTSPUtils {private static final int TIMEOUT_MS 10000…

我的創作紀念日(2周年)

機緣 在進入大學之前&#xff0c;完全沒有聽說過CSDN&#xff0c;第一次使用CSDN應該是搜C語言如何學&#xff0c;或者是和C語言相關的其他內容 因為我本人是學計算機專業的&#xff0c;大一剛開學因為疫情延遲了開學時間&#xff0c;老師線上教課&#xff0c;但是我之前是完…

永磁同步電機反電動勢系數怎么算?磁鏈強度怎么算?轉矩系數怎么算?

在進行永磁同步電機simulink仿真時&#xff0c;一個關鍵參數就是永磁體磁鏈強度&#xff0c; 實際上在simulink中&#xff0c;永磁體磁鏈強度/反電動勢系數/轉矩系數這三個是放一起的&#xff0c;這是因為他們都可互相算出來。 Torque constat (Nm/A) 轉矩系數 1.5 * Np *…

在瀏覽器中存儲token的最佳實踐

在瀏覽器中存儲token的最佳實踐 Web 應用程序不是靜態站點&#xff0c;而是靜態和動態內容的精心組合。更常見的是&#xff0c;Web 應用程序邏輯在瀏覽器中運行。該應用程序不是從服務器獲取所有內容&#xff0c;而是在瀏覽器中運行 JavaScript&#xff0c;從后端 API 獲取數據…

Tomcat部署開源站點JPress

前言 JPress使用Java開發&#xff0c;是我們常見的開源博客系統。JPress是一個開源的WordPress插件&#xff0c;它提供了一個簡單而強大的方式來創建企業級站點。該插件包括許多特性&#xff0c;例如主題定制、頁面構建器、性能優化、SEO、安全、電子商務和社交媒體整合等。使用…

Linux卸載MySql(簡潔版)

安裝MySql https://blog.csdn.net/tongxin_tongmeng/article/details/128263398 停止服務 service mysql stop 刪除服務 chkconfig --del mysql 刪除目錄 rm -rf /opt/mysql 刪除配置 rm -f /etc/my.cnf 刪除啟動腳本 rm -f /etc/init.d/mysql 刪除用戶和組 userdel mysql &am…

C_1練習題答案

1.在一個C程序中() A. main函數必須出現在所有函數之前 B. main函數可以出現在任何地方 C. main函數必須出現在所有函數之后 D. main 函數必須出現在固定位置 B 2.下列不合法的用戶標識符是() A. j2_KEY B. Double C. 4d_a D.8 C 3,在“文件包含”預處理語句的使用過程…

thinkphp6入門(12)-- 一對一關聯模型

定義一對一關聯&#xff0c;例如&#xff0c;一個用戶都有一個個人資料。 一、兩表 1.用戶表:user 2.工作經驗表&#xff1a;work_experience user表的id關聯work_experience表的user_id。 注意看&#xff0c;user_id1的有2條工作經驗 二、數據模型 主表模型&#xff1a;…