### 关于机器学习西瓜数据集课后作业5.5的解答与解析
#### 实现标准BP算法和累计BP算法
针对西瓜数据集3.0,实现单隐层网络的标准反向传播(BP)算法和累积BP算法涉及多个方面。对于此类问题,通常会构建一个具有输入层、隐藏层以及输出层的前馈神经网络模型。
在具体编码过程中,需定义激活函数及其导数用于计算各层节点输出值;初始化权重参数;通过正向传播过程获取预测结果并与真实标签对比得到误差;再依据链式法则逆向调整权值完成一次迭代更新操作[^1]。
```python
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
s = sigmoid(x)
return s * (1 - s)
class NeuralNetwork:
def __init__(self, input_size=9, hidden_size=4, output_size=1):
self.input_weights = np.random.randn(input_size, hidden_size)
self.hidden_bias = np.zeros((1, hidden_size))
self.output_weights = np.random.randn(hidden_size, output_size)
self.output_bias = np.zeros((1, output_size))
def forward(self, X):
z_hidden = np.dot(X, self.input_weights) + self.hidden_bias
a_hidden = sigmoid(z_hidden)
z_output = np.dot(a_hidden, self.output_weights) + self.output_bias
y_hat = sigmoid(z_output)
return y_hat, a_hidden
def backward(self, X, Y, learning_rate=0.1):
m = X.shape[0]
# Forward pass
y_hat, a_hidden = self.forward(X)
# Backward pass
error_output = (y_hat - Y) * sigmoid_derivative(y_hat)
delta_output_weights = np.dot(a_hidden.T, error_output) / m
delta_output_bias = np.sum(error_output, axis=0, keepdims=True) / m
error_hidden = np.dot(error_output, self.output_weights.T) * sigmoid_derivative(a_hidden)
delta_input_weights = np.dot(X.T, error_hidden) / m
delta_hidden_bias = np.sum(error_hidden, axis=0, keepdims=True) / m
# Update weights and biases using gradient descent
self.output_weights -= learning_rate * delta_output_weights
self.output_bias -= learning_rate * delta_output_bias
self.input_weights -= learning_rate * delta_input_weights
self.hidden_bias -= learning_rate * delta_hidden_bias
```
此代码片段展示了如何创建一个简单的两层(含输入层)全连接人工神经元网络,并实现了基本的向前传递(`forward`)方法来计算给定样本特征下的估计目标变量值,还有向后传递(`backward`)机制来进行参数优化[^2]。
#### 数据预处理与训练流程
为了使上述模型能够应用于实际的数据集中,还需要对原始数据进行必要的清理和转换工作。这包括但不限于缺失值填补、类别型属性数值化等步骤。接着便是划分训练集与验证集以便评估模型性能并防止过拟合现象的发生。
当准备就绪之后,则可按照如下方式调用之前编写的类实例对象执行批量或在线式的监督学习任务:
```python
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# Load watermelon dataset here...
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_val_scaled = scaler.transform(X_val)
nn = NeuralNetwork()
for epoch in range(num_epochs):
nn.backward(X_train_scaled, y_train.reshape(-1, 1), learning_rate=learning_rate)
if epoch % display_step == 0 or epoch == num_epochs-1:
predictions, _ = nn.forward(X_val_scaled)
loss = ((predictions.flatten() - y_val)**2).mean()/2
print(f'Epoch {epoch}, Loss={loss:.8f}')
```
这段脚本说明了怎样加载并分割好实验所需的素材,同时运用标准化技术缩放连续特性范围内的差异程度以加速收敛速度。随后循环遍历整个时期(epoch),不断重复修正内部结构直至满足终止条件为止[^3]。