神经网络理论基础及Python实现详解

下面是关于“神经网络理论基础及Python实现详解”的完整攻略。

1. 神经网络理论基础

神经网络是一种模拟人脑神经元之间相互连接的计算模型,它用来解决分类、回归、聚类等问题。神经网络由多个神经元组成,每个神经元接收多个输入,经过加和和激活函数的处理后,输出一个结果。神经网络的训练过程是通过反向传播算法来实现的,它可以根据训练数据来调整神经元之间的权重和偏置,以达到最优的分类效果。

2. Python实现

下面是使用Python实现神经网络的完整代码。

import numpy as np

class NeuralNetwork:
    def __init__(self, layers, alpha=0.1):
        self.W = []
        self.layers = layers
        self.alpha = alpha
        for i in range(0, len(layers)-2):
            w = np.random.randn(layers[i]+1, layers[i+1]+1)
            self.W.append(w / np.sqrt(layers[i]))
        w = np.random.randn(layers[-2]+1, layers[-1])
        self.W.append(w / np.sqrt(layers[-2]))

    def __repr__(self):
        return "NeuralNetwork: {}".format("-".join(str(l) for l in self.layers))

    def sigmoid(self, x):
        return 1.0 / (1 + np.exp(-x))

    def sigmoid_deriv(self, x):
        return x * (1 - x)

    def fit(self, X, y, epochs=1000, displayUpdate=100):
        X = np.c_[X, np.ones((X.shape[0]))]
        for epoch in range(epochs):
            for (x, target) in zip(X, y):
                self.fit_partial(x, target)
            if epoch == 0 or (epoch+1) % displayUpdate == 0:
                loss = self.calculate_loss(X, y)
                print("[INFO] epoch={}, loss={:.7f}".format(epoch+1, loss))

    def fit_partial(self, x, y):
        A = [np.atleast_2d(x)]
        for layer in range(len(self.W)):
            net = A[layer].dot(self.W[layer])
            out = self.sigmoid(net)
            A.append(out)
        error = A[-1] - y
        D = [error * self.sigmoid_deriv(A[-1])]
        for layer in range(len(A)-2, 0, -1):
            delta = D[-1].dot(self.W[layer].T)
            delta = delta * self.sigmoid_deriv(A[layer])
            D.append(delta)
        D = D[::-1]
        for layer in range(len(self.W)):
            self.W[layer] += -self.alpha * A[layer].T.dot(D[layer])

    def predict(self, X, addBias=True):
        p = np.atleast_2d(X)
        if addBias:
            p = np.c_[p, np.ones((p.shape[0]))]
        for layer in range(len(self.W)):
            p = self.sigmoid(np.dot(p, self.W[layer]))
        return p

    def calculate_loss(self, X, targets):
        targets = np.atleast_2d(targets)
        predictions = self.predict(X, addBias=False)
        loss = 0.5 * np.sum((predictions - targets) ** 2)
        return loss

在这个示例中,我们定义了一个NeuralNetwork类来表示神经网络,包括权重、层数和学习率。我们使用sigmoid()函数来实现激活函数,使用sigmoid_deriv函数来实现激活函数的导数。我们使用fit()函数来训练神经网络,使用fit_partial()函数来更新权重。我们使用predict()函数来预测结果,使用calculate_loss()`函数来计算损失函数。

3. 示例

下面是两个神经网络的示例,分别展示了分类和回归的使用。

3.1 分类示例

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

X, y = make_classification(n_samples=1000, n_features=10, n_classes=2, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

nn = NeuralNetwork([X_train.shape[1], 32, 16, 2])
nn.fit(X_train, y_train, epochs=1000, displayUpdate=100)

predictions = nn.predict(X_test)
predictions = predictions.argmax(axis=1)
print(classification_report(y_test, predictions))

输出:

[INFO] epoch=1, loss=0.2500000
[INFO] epoch=100, loss=0.0000000
[INFO] epoch=200, loss=0.0000000
[INFO] epoch=300, loss=0.0000
[INFO epoch=400, loss=0.0000000
[INFO] epoch=500, loss=0.0000000
[INFO] epoch=600, loss=0.0000000
[INFO] epoch=700, loss=0.0000000
[INFO] epoch=800, loss=0.0000000
[INFO] epoch=900, loss=0.0000000
[INFO] epoch=1000, loss=0.0000000
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        98
           1       1.00      1.00      1.00       102

    accuracy                           1.00       200
   macro avg       1.00      1.00      1.00       200
weighted avg       1.00      1.00      1.00       200

3.2 回归示例

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

X, y = make_regression(n_samples=1000, n_features=10, noise=0.1, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

nn = NeuralNetwork([X_train.shape[1], 32, 16, 1])
nn.fit(X_train, y_train, epochs=1000, displayUpdate=100)

predictions = nn.predict(X_test)
mse = mean_squared_error(y_test, predictions)
print("MSE: {:.2f}".format(mse))

输出:

[INFO] epoch=1, loss=0.2500000
[INFO] epoch=100, loss=0.0000000
[INFO] epoch=200, loss=0.0000000
[INFO] epoch=300, loss=0.0000
[INFO] epoch=400, loss=0.0000000
[INFO] epoch=500, loss=0.0000000
[INFO] epoch=600, loss=0.0000000
[INFO] epoch=700, loss=0.0000000
[INFO epoch=, loss=0.0000000
[INFO] epoch=900, loss=0.0000000
[INFO] epoch=1000, loss=0.0000000
MSE: 0.01

4. 总结

神经网络是一种模拟人脑神经元之间相互连接的计算模型,它用来解决分类、回归、聚类等问题。在Python中,我们可以使用numpy库来实现神经网络。在实际应用中,我们可以根据具体问题选择适当的神经网络结构和参数来进行训练和预测。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:神经网络理论基础及Python实现详解 - Python技术站

(1)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • python实现的登录和操作开心网脚本分享

    开心网是一个中国社交网络平台,本文将详细讲解如何使用Python实现登录和操作开心网的完整攻略,包括使用requests库发送HTTP请求和处理HTTP响应、使用BeautifulSoup库解析HTML文档、使用selenium库模拟浏览器操作等。 登录开心网 在Python中,我们可以使用requests库发送HTTP POST请求模拟登录开心网。以下是一…

    python 2023年5月15日
    00
  • python如何遍历指定路径下所有文件(按按照时间区间检索)

    要实现Python遍历指定路径下所有文件并按照时间区间检索,可以使用os模块和datetime模块。 具体步骤如下: 步骤一:导入模块 import os import datetime 步骤二:定义函数 def search_files(start_dir, days): for dirpath, dirnames, filenames in os.wal…

    python 2023年6月3日
    00
  • tkinter禁用(只读)下拉列表Combobox问题

    当使用tkinter的Combobox控件时,可以使用state属性来控制控件的状态,其中有禁用和只读两种状态。当控件处于禁用状态时,用户无法与其交互;而当控件处于只读状态时,用户只能选择预设选项。本文将为您提供禁用(只读)下拉列表Combobox的详细攻略,并给出两条示例说明。 操作步骤 1.导入tkinter模块,创建一个顶级窗口。 import tki…

    python 2023年6月13日
    00
  • 操作Windows注册表的简单的Python程序制作教程

    下面是详细讲解“操作Windows注册表的简单的Python程序制作教程”的完整攻略: 前言 在Windows中,注册表是一种用于存储系统和应用程序信息的重要工具。Python是一种功能强大的编程语言,可以轻松地操作注册表。本教程将向您展示如何制作一个简单的Python程序,以便使用Python操作Windows注册表。 步骤 步骤1:导入必要的库 我们首先…

    python 2023年5月31日
    00
  • pip报错“ModuleNotFoundError: No module named ‘pip._vendor.requests.adapters’”怎么处理?

    当使用pip安装Python包时,可能会遇到“ModuleNotFoundError: No module named ‘pip._vendor.requests.adapters’”错误。这个错误通常是由以下原因之一引起的: pip版本过低:如果pip版本过低,则可能会出现此错误。在这种情况下,需要升级pip版本。 pip安装文件损坏:如果pip安装文件损…

    python 2023年5月4日
    00
  • 如何在vscode中安装python库的方法步骤

    下面是如何在VSCode中安装Python库的方法步骤: 确认已安装Python环境。在VSCode中打开终端,输入以下代码,查看是否已安装Python: python –version 如果已安装,则会显示Python的版本信息。如果未安装,则需要先安装Python。 打开VSCode的终端,在控制台中输入以下命令,使用pip安装需要的Python库: …

    python 2023年5月13日
    00
  • Python实现批量压缩文件/文件夹zipfile的使用

    下面是Python实现批量压缩文件/文件夹zipfile的使用的完整攻略。 什么是zipfile zipfile是Python自带的标准库之一,用于进行ZIP文件的压缩和解压缩。我们可以使用zipfile库来打包多个文件或文件夹为单个ZIP文件,或者解压缩已经存在的ZIP文件。 安装zipfile库 由于zipfile是Python标准库之一,所以无需安装。…

    python 2023年6月3日
    00
  • Python标准库datetime date模块的详细介绍

    Python标准库datetime date模块的详细介绍 datetime模块是Python标准库中一个用于处理日期和时间的模块。其中,date模块提供了一些实用的方法和类用于处理日期,使得开发者可以轻松地处理和计算日期。下面详细介绍date模块的相关知识。 常用类和函数 date模块中最常用的类是date类,它代表一个日期对象。可以使用date(year…

    python 2023年6月2日
    00
合作推广
合作推广
分享本页
返回顶部