作业(2023年9月18日)

一、bp神经网络算法

bp神经网络算法

import numpy as np

# 定义Sigmoid激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 初始化神经网络参数
input_size = 2
hidden_size = 4
output_size = 1
learning_rate = 0.1

# 初始化权重和偏差
weights_input_hidden = np.random.uniform(size=(input_size, hidden_size))
bias_input_hidden = np.zeros((1, hidden_size))
weights_hidden_output = np.random.uniform(size=(hidden_size, output_size))
bias_hidden_output = np.zeros((1, output_size))

# 训练数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])

# 训练神经网络
for epoch in range(10000):
    # 前向传播
    hidden_input = np.dot(X, weights_input_hidden) + bias_input_hidden
    hidden_output = sigmoid(hidden_input)
    output_input = np.dot(hidden_output, weights_hidden_output) + bias_hidden_output
    predicted_output = sigmoid(output_input)

    # 计算损失
    loss = np.mean(0.5 * (predicted_output - y) ** 2)

    # 反向传播
    delta_output = (predicted_output - y) * predicted_output * (1 - predicted_output)
    delta_hidden = np.dot(delta_output, weights_hidden_output.T) * hidden_output * (1 - hidden_output)

    # 更新权重和偏差
    weights_hidden_output -= learning_rate * np.dot(hidden_output.T, delta_output)
    bias_hidden_output -= learning_rate * np.sum(delta_output, axis=0)
    weights_input_hidden -= learning_rate * np.dot(X.T, delta_hidden)
    bias_input_hidden -= learning_rate * np.sum(delta_hidden, axis=0)

    if epoch % 1000 == 0:
        print(f"Epoch {epoch}, Loss: {loss:.4f}")

# 测试神经网络
test_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
test_hidden_input = np.dot(test_data, weights_input_hidden) + bias_input_hidden
test_hidden_output = sigmoid(test_hidden_input)
test_output_input = np.dot(test_hidden_output, weights_hidden_output) + bias_hidden_output
test_predicted_output = sigmoid(test_output_input)
print("Final Predictions:")
print(test_predicted_output)

这个示例是一个三层的前馈神经网络,包括输入层、一个隐藏层和一个输出层。网络用于二分类任务,使用Sigmoid作为激活函数

BP神经网络,也称为反向传播神经网络(Backpropagation Neural Network),是一种常用于机器学习和深度学习任务的人工神经网络模型。它是一种前馈神经网络,通常用于监督学习任务,如分类和回归。

以下是BP神经网络的主要特征和工作原理:

  1. 神经元结构:BP神经网络由多个神经元(也称为节点或单元)组成,分为输入层、隐藏层和输出层。每个神经元与前一层的所有神经元相连接。

  2. 前馈传播:在训练过程中,输入数据从输入层传递到输出层的过程称为前馈传播。每个神经元将其输入加权求和,并通过激活函数进行非线性变换,然后将输出传递给下一层。

  3. 权重更新:BP神经网络的关键部分是权重更新。在训练过程中,网络根据损失函数的梯度来调整连接神经元之间的权重,以最小化预测与实际值之间的误差。这是通过反向传播算法完成的。

  4. 反向传播算法:反向传播算法是BP神经网络的核心。它通过计算损失函数相对于每个权重的梯度来确定如何调整权重。这个梯度信息然后从输出层传播回隐藏层和输入层,以逐层调整权重。这个过程是反复迭代的,直到损失函数收敛到一个较小的值。

  5. 激活函数:神经元的激活函数通常是非线性的,以增加网络的表示能力。常见的激活函数包括Sigmoid、ReLU(Rectified Linear Unit)、Tanh等。

  6. 隐藏层:BP神经网络通常包括一个或多个隐藏层,这些隐藏层有助于网络学习复杂的特征和关系。

BP神经网络在各种任务中表现出色,特别是在图像识别、自然语言处理和推荐系统等领域。然而,它也有一些限制,如需要大量标记数据来进行监督训练,容易陷入局部最小值,以及对超参数的敏感性。

在深度学习的发展中,BP神经网络的变体和改进版本不断涌现,例如卷积神经网络(CNN)和循环神经网络(RNN),它们在特定任务上表现更好。

二、感知器

import numpy as np

class Perceptron:
    def __init__(self, input_size, learning_rate=0.1, epochs=100):
        self.weights = np.zeros(input_size)
        self.learning_rate = learning_rate
        self.epochs = epochs

    def predict(self, inputs):
        # 计算加权和
        weighted_sum = np.dot(inputs, self.weights)
        # 应用阈值函数(这里使用简单的阶跃函数)
        if weighted_sum >= 0:
            return 1
        else:
            return 0

    def train(self, training_data, labels):
        for _ in range(self.epochs):
            for inputs, label in zip(training_data, labels):
                prediction = self.predict(inputs)
                # 更新权重
                self.weights += self.learning_rate * (label - prediction) * inputs

# 训练数据和标签
training_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
labels = np.array([0, 0, 0, 1])

# 创建感知器
perceptron = Perceptron(input_size=2)

# 训练感知器
perceptron.train(training_data, labels)

# 测试感知器
test_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
for inputs in test_data:
    prediction = perceptron.predict(inputs)
    print(f"Inputs: {inputs}, Prediction: {prediction}")

感知器(Perceptron)是一种简单的人工神经元模型,用于二分类任务。它由美国心理学家兼计算机科学家Frank Rosenblatt于1957年提出,并被认为是神经网络和深度学习的雏形。

感知器的基本思想是受到生物神经元的启发。它接收多个输入,对每个输入施加权重,然后将这些加权输入相加,最后通过一个激活函数来产生输出。通常,感知器的输出是二进制的,表示输入属于两个类别中的一个。

以下是感知器的主要组成部分:

  1. 输入(Input):感知器接收多个二进制输入信号(0或1),每个输入都与一个权重相关联。

  2. 权重(Weights):每个输入都有一个权重,它表示了该输入在计算中的相对重要性。权重可以是任何实数值,包括正数和负数。

  3. 加权和(Weighted Sum):感知器将每个输入与其对应的权重相乘,然后将它们的总和计算出来。这个总和称为加权和。

  4. 阈值(Threshold):感知器还有一个阈值(或偏差),它是一个可调参数。如果加权和大于或等于阈值,则感知器输出1;否则,输出0。

  5. 激活函数(Activation Function):激活函数用于将加权和映射到输出。通常,激活函数是阶跃函数,将加权和与阈值进行比较,然后产生输出。

感知器的训练是一个简单的过程,通常使用带有已知类别标签的训练样本来完成。如果感知器对样本的预测与真实标签不符,就会调整权重和阈值以改进性能。这个过程一直重复,直到感知器能够正确分类所有的训练样本或达到某个停止条件。

需要注意的是,感知器只能解决线性可分问题,即可以用一条直线或超平面将两个类别分开的问题。对于复杂的非线性问题,单个感知器是不足够的。然而,多个感知器可以组合成多层感知器(也就是多层神经网络),从而可以处理更复杂的任务。这是深度学习的基础。感知器的主要用途是了解神经网络的基本概念和原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值