神经网络理论基础及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中TypeError:unhashable type:’dict’错误的解决办法

    当我们在使用Python的字典时,如果字典的key是可哈希的对象,那么可以使用该key对应的value。但如果key不可哈希(例如字典或列表等可变对象),就会报“TypeError: unhashable type: ‘dict’”类型错误的异常。下面是解决这个错误的一些方法。 方法一:使用不可变对象作为字典的key 一个可哈希的对象必须是不可变的,因为 如…

    python 2023年5月13日
    00
  • python3.4+pycharm 环境安装及使用方法

    以下是关于“Python3.4+PyCharm环境安装及使用方法”的完整攻略: 环境安装 安装Python3.4 访问Python官网(https://www.python.org/downloads/release/python-340/)下载Python3.4的安装包。 双击安装包,按照提示进行安装。 安装后,打开命令行窗口,输入以下命令,检查Pytho…

    python 2023年5月13日
    00
  • 使用requests库制作Python爬虫

    下面是使用requests库制作Python爬虫的完整攻略。 一、什么是requests库 requests是Python的一个第三方库,用于处理HTTP请求。通过requests模块,可以很方便地向网络服务器发送请求并获取响应数据。requests库拥有简单易用的API,是Python中最常用的HTTP库之一。 二、使用requests库制作爬虫的基本步骤…

    python 2023年6月3日
    00
  • python的time模块和datetime模块实例解析

    Python的time模块和datetime模块实例解析 Python中的time和datetime模块,都是用来处理日期和时间的模块。time模块主要是用于程序中对时间的计算等操作;datetime模块则是用于更加复杂的时间操作,例如时区转换等。本文将详细讲解time和datetime模块在Python中的应用和方法。 time模块 time模块是Pyth…

    python 2023年6月2日
    00
  • Python CSV模块使用实例

    当我们需要从CSV文件中读取或写入数据时,Python提供了一个内置的CSV模块,该模块可以轻松地读取和写入CSV文件。接下来就让我们来详细讲解一下Python CSV模块的使用。 CSV模块的导入 要使用CSV模块,我们需要先将其导入到Python脚本中。代码如下: import csv 读取CSV文件 要读取CSV文件,需要使用Python内置的csv.…

    python 2023年6月3日
    00
  • 详解Python的三种拷贝方式

    详解Python的三种拷贝方式 在Python中,变量不是直接存储值,而是存储值所在内存地址的引用。因此,对变量的操作实际上是对内存中引用的操作。在进行赋值、传递参数等操作时,需要对内存中的数据进行拷贝。Python中有三种拷贝方式,分别是浅拷贝、深拷贝和赋值拷贝。 浅拷贝 浅拷贝只是拷贝对象的一层引用,也就是新对象中的列表、集合等容器对象中的元素,仍然是原…

    python 2023年5月13日
    00
  • Python生成任意范围任意精度的随机数方法

    生成随机数是Python编程中很常见的操作。Python提供了一个标准库random,可以用于生成随机数。但是,由于Python默认的随机数生成器的种子是时间,而且在一些情况下生成的随机数并不能满足特定要求,因此需要使用其他的方法实现生成任意范围任意精度的随机数。 以下是Python生成任意范围任意精度的随机数的攻略: Step 1: 导入必要的库 为了能够…

    python 2023年6月3日
    00
  • Python实例分享:快速查找出被挂马的文件

    下面是关于“Python实例分享:快速查找出被挂马的文件”的完整攻略的详细讲解。 什么是被挂马的文件 “被挂马”的文件是指已经被黑客攻击添加了恶意脚本的文件,这些恶意脚本可能会给网站带来安全风险,严重时甚至会导致网站瘫痪。所以,快速查找出被挂马的文件非常重要。 如何查找被挂马的文件 第一步:查找可疑文件 被挂马的文件一般会被隐藏在常用的文件中,如PHP文件,…

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