小白入门机器学习:用Python实现神经网络基础
机器学习听起来是不是很神秘?其实,它并没有想象中那么复杂!今天,我将带你从零开始,用Python实现一个简单的神经网络。即使你没有任何机器学习的基础,也可以轻松跟上。准备好了吗?让我们一起踏上这段奇妙的旅程吧!

一、神经网络是什么?
在开始之前,我们先来了解一下神经网络的基本概念。神经网络是一种模仿人脑神经元结构的计算模型,它由大量的节点(神经元)和连接这些节点的边组成。每个节点可以接收输入信号,并通过一个激活函数输出信号。神经网络通过调整这些连接的权重,学习输入数据与输出结果之间的关系。
(一)为什么选择神经网络?
神经网络在许多领域都有广泛的应用,比如图像识别、语音识别、自然语言处理等。它能够自动从数据中学习复杂的模式,而不需要我们手动提取特征。这使得神经网络在处理大规模复杂数据时具有很大的优势。
(二)神经网络的基本结构
一个简单的神经网络通常包括输入层、隐藏层和输出层。输入层接收输入数据,隐藏层对数据进行处理,输出层则给出最终的预测结果。每一层都包含多个神经元,神经元之间通过权重连接。
二、Python实现神经网络
接下来,我们将用Python实现一个简单的神经网络。我们会从最基础的代码开始,逐步构建一个完整的模型。别担心,我会详细解释每一步,确保你能够理解。
(一)环境准备
在开始之前,确保你的Python环境中安装了以下库:
-
NumPy:用于高效的数值计算。
-
Matplotlib:用于绘图。
如果还没有安装,可以通过以下命令安装:
bash
复制
pip install numpy matplotlib
(二)构建神经网络
1. 数据准备
我们先从一个简单的二分类任务开始。假设我们有一些二维数据点,每个点属于两个类别之一。我们将使用这些数据来训练我们的神经网络。
Python
复制
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据
np.random.seed(0)
X = np.random.rand(100, 2) # 生成100个二维数据点
y = (X[:, 0] + X[:, 1] > 1).astype(int) # 根据条件生成标签
# 绘制数据分布
plt.scatter(X[y == 0][:, 0], X[y == 0][:, 1], color='red', label='Class 0')
plt.scatter(X[y == 1][:, 0], X[y == 1][:, 1], color='blue', label='Class 1')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()
2. 神经网络的结构
我们将构建一个包含一个隐藏层的简单神经网络。隐藏层有4个神经元,输出层有1个神经元,用于二分类任务。
3. 初始化参数
我们需要初始化神经网络的权重和偏置。权重是随机初始化的,偏置可以初始化为零。
Python
复制
# 初始化参数
input_size = 2 # 输入层大小
hidden_size = 4 # 隐藏层大小
output_size = 1 # 输出层大小
# 权重和偏置初始化
W1 = np.random.randn(input_size, hidden_size) # 输入层到隐藏层的权重
b1 = np.zeros((1, hidden_size)) # 隐藏层偏置
W2 = np.random.randn(hidden_size, output_size) # 隐藏层到输出层的权重
b2 = np.zeros((1, output_size)) # 输出层偏置
4. 激活函数
激活函数是神经网络中的关键部分,它为模型引入非线性。我们这里使用Sigmoid激活函数。
Python
复制
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return x * (1 - x)
5. 前向传播
前向传播是神经网络的计算过程,从输入层到输出层逐层计算。
Python
复制
# 前向传播
def forward(X, W1, b1, W2, b2):
Z1 = np.dot(X, W1) + b1 # 输入层到隐藏层的线性变换
A1 = sigmoid(Z1) # 隐藏层激活函数
Z2 = np.dot(A1, W2) + b2 # 隐藏层到输出层的线性变换
A2 = sigmoid(Z2) # 输出层激活函数
return Z1, A1, Z2, A2
6. 损失函数
损失函数衡量了模型预测值与真实值之间的差异。我们这里使用二元交叉熵损失函数。
Python
复制
def binary_crossentropy(y_true, y_pred):
return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred))
7. 反向传播
反向传播是神经网络的训练过程,通过计算损失函数对每个参数的梯度,更新权重和偏置。
Python
复制
# 反向传播
def backward(X, y, Z1, A1, Z2, A2, W2):
m = X.shape[0]
dZ2 = A2 - y.reshape(-1, 1) # 输出层梯度
dW2 = np.dot(A1.T, dZ2) / m # 输出层权重梯度
db2 = np.sum(dZ2, axis=0, keepdims=True) / m # 输出层偏置梯度
dZ1 = np.dot(dZ2, W2.T) * sigmoid_derivative(A1) # 隐藏层梯度
dW1 = np.dot(X.T, dZ1) / m # 隐藏层权重梯度
db1 = np.sum(dZ1, axis=0, keepdims=True) / m # 隐藏层偏置梯度
return dW1, db1, dW2, db2
8. 参数更新
根据计算得到的梯度,更新权重和偏置。
Python
复制
# 参数更新
def update_parameters(W1, b1, W2, b2, dW1, db1, dW2, db2, learning_rate):
W1 -= learning_rate * dW1
b1 -= learning_rate * db1
W2 -= learning_rate * dW2
b2 -= learning_rate * db2
return W1, b1, W2, b2
9. 训练过程
将上述步骤组合起来,完成整个训练过程。
Python
复制
# 训练神经网络
def train(X, y, epochs, learning_rate):
W1 = np.random.randn(input_size, hidden_size)
b1 = np.zeros((1, hidden_size))
W2 = np.random.randn(hidden_size, output_size)
b2 = np.zeros((1, output_size))
for epoch in range(epochs):
Z1, A1, Z2, A2 = forward(X, W1, b1, W2, b2)
loss = binary_crossentropy(y, A2)
if epoch % 100 == 0:
print(f"Epoch {epoch}, Loss: {loss}")
dW1, db1, dW2, db2 = backward(X, y, Z1, A1, Z2, A2, W2)
W1, b1, W2, b2 = update_parameters(W1, b1, W2, b2, dW1, db1, dW2, db2, learning_rate)
return W1, b1, W2, b2
# 训练模型
epochs = 1000
learning_rate = 0.1
W1, b1, W2, b2 = train(X, y, epochs, learning_rate)
(三)测试模型
训练完成后,我们可以用训练好的模型对新的数据进行预测。
Python
复制
# 测试模型
def predict(X, W1, b1, W2, b2):
_, _, _, A2 = forward(X, W1, b1, W2, b2)
return (A2 > 0.5).astype(int)
# 测试数据
X_test = np.array([[0.1, 0.2], [0.8, 0.9]])
y_pred = predict(X_test, W1, b1, W2, b2)
print("预测结果:", y_pred)
三、总结
通过以上步骤,我们用Python实现了一个简单的神经网络。虽然这个模型非常基础,但它涵盖了神经网络的核心概念,包括前向传播、损失函数、反向传播和参数更新。希望这篇文章能帮助你更好地理解神经网络的工作原理。
更多推荐

所有评论(0)