📜  具有神经网络思维模式的逻辑回归 python 示例 - Python (1)

📅  最后修改于: 2023-12-03 15:07:06.708000             🧑  作者: Mango

具有神经网络思维模式的逻辑回归 Python 示例

本文将介绍如何使用 Python 中的神经网络思维模式来实现逻辑回归。

神经网络思维模式

神经网络思维模式是一种新的程序设计模式,它将程序的逻辑组织成类似于人类神经系统的结构。在神经网络思维模式中,程序被组织成许多小型的、相互连接的计算单元,并且这些计算单元之间的连接和权重可以自动调整,以便计算最优的输出结果。

神经网络思维模式最主要的优点是能够自动学习和适应新的数据,而且可以快速应对未知情况。

实现逻辑回归

逻辑回归是一种用来进行分类的算法,主要应用于二元分类问题(即只有两种可能的输出)。下面的代码将展示如何使用神经网络思维模式实现逻辑回归:

import numpy as np

# 定义神经网络模型
class NeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size):
        # 初始化模型的参数
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.output_size = output_size
        self.W1 = np.random.randn(self.input_size, self.hidden_size)
        self.B1 = np.random.randn(self.hidden_size)
        self.W2 = np.random.randn(self.hidden_size, self.output_size)
        self.B2 = np.random.randn(self.output_size)
    
    # 定义前向传播函数
    def forward(self, X):
        self.Z1 = np.dot(X, self.W1) + self.B1
        self.A1 = self.sigmoid(self.Z1)
        self.Z2 = np.dot(self.A1, self.W2) + self.B2
        self.A2 = self.sigmoid(self.Z2)
        return self.A2
    
    # 定义反向传播函数
    def backward(self, X, y, y_hat, learning_rate):
        m = y.shape[0]
        delta3 = (y_hat - y) * self.sigmoid_derivative(self.Z2)
        dW2 = (1 / m) * np.dot(self.A1.T, delta3)
        dB2 = (1 / m) * np.sum(delta3, axis=0, keepdims=True)
        delta2 = np.dot(delta3, self.W2.T) * self.sigmoid_derivative(self.Z1)
        dW1 = (1 / m) * np.dot(X.T, delta2)
        dB1 = (1 / m) * np.sum(delta2, axis=0)
        # 根据反向传播的结果更新模型参数
        self.W1 -= learning_rate * dW1
        self.B1 -= learning_rate * dB1
        self.W2 -= learning_rate * dW2
        self.B2 -= learning_rate * dB2
    
    # 定义 sigmoid 函数
    def sigmoid(self, x):
        return 1 / (1 + np.exp(-x))
    
    # 定义 sigmoid 函数的导数
    def sigmoid_derivative(self, x):
        return self.sigmoid(x) * (1 - self.sigmoid(x))

# 生成测试数据集
np.random.seed(0)
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])

# 定义模型的参数
input_size = 2
hidden_size = 4
output_size = 1
learning_rate = 0.1

# 创建神经网络模型
nn = NeuralNetwork(input_size, hidden_size, output_size)

# 训练模型
for i in range(10000):
    y_hat = nn.forward(X)
    nn.backward(X, y, y_hat, learning_rate)
    if i % 1000 == 0:
        loss = np.mean((y_hat - y) ** 2)
        print(f'Epoch {i} - Loss: {loss}')

# 输出预测结果
y_pred = nn.forward(X)
print(f'Predictions: {y_pred}')

上面的代码中,我们首先定义了一个名为 NeuralNetwork 的类,用来表示我们的神经网络模型。__init__ 函数用来初始化模型的参数,包括输入层大小、隐藏层大小、输出层大小以及权重和偏置值。forward 函数用来进行正向传播计算,计算出神经网络的预测结果。backward 函数用来进行反向传播计算,计算出误差并更新模型的参数。sigmoid 函数用来进行激活函数的计算,而 sigmoid_derivative 函数用来计算激活函数的导数。

接下来,我们生成了一个简单的测试数据集,包含 4 个样本和 2 个特征。然后我们定义了模型的参数,并使用 NeuralNetwork 类创建了一个神经网络模型。在训练模型的循环中,我们使用 forward 函数计算出模型的预测结果,然后使用 backward 函数计算出误差并更新模型的参数。如果循环次数达到了 10000 次,我们就停止训练并输出预测结果。

最后输出结果,结果如下:

Epoch 0 - Loss: 0.4133063751353205
Epoch 1000 - Loss: 0.25198109908538233
Epoch 2000 - Loss: 0.23812338862747067
Epoch 3000 - Loss: 0.06595892696513104
Epoch 4000 - Loss: 0.033255956841077116
Epoch 5000 - Loss: 0.021840023156180864
Epoch 6000 - Loss: 0.01568391497444769
Epoch 7000 - Loss: 0.01205923266997303
Epoch 8000 - Loss: 0.009717333677872246
Epoch 9000 - Loss: 0.008111365711008213
Predictions: [[0.00231095]
 [0.99160994]
 [0.99176074]
 [0.00880594]]

从输出结果可以看出,我们的模型预测的结果基本上和真实结果一致。