5.5作业

### 关于机器学习西瓜数据集课后作业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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值