根据题目要求,完成下方代码(只在begin end注释范围内填写代码)。使用除cnn外最复杂有效的算法,请不要删除原代码中的所有注释。应该考虑多种噪声类型(高斯噪声、椒盐噪声、泊松噪声) 期末论文数据集介绍 训练集 共10类,每类有100张干净的手写数字图像,每张图像是28×28大小的灰度图像。训练集文件名为training_dataset.pkl,可用pickle库导入,导入后可得一个由10个元素组成的字典(dict),每个元素代表一类。元素的键(key)即为类标签,元素的值(value)是一个包含了对应的100张训练图像的列表。每张图像是28×28大小的numpy数组。 以下是导入训练集,并显示其中一张训练图像的示例代码。 import pickle from PIL import Image with open('training_dataset.pkl', 'rb') as f: training_dataset = pickle.load(f) image = training_dataset[9][80] img = Image.fromarray(image) img.show() 测试集 共有7种测试集。其中1种为干净测试集,其他6种为不干净(即受噪声污染)的测试集。每种不干净的测试集都受到一种类型的噪声污染,例如第一种不干净测试集受到椒盐噪声污染。根据噪声含量的不同,每种不干净测试集又分为3个等级的测试集。因此,总共有1+6×3=19个测试集。每个测试集都有与训练集对应的10类手写数字图像,每类有50张测试图像。 #encoding=utf8 import numpy as np import pickle #********* Begin *********# #********* End *********# def load_dataset(file_name): ''' 从文件读入数据集 被多处调用,请勿删除或改动本函数!!! ''' with open(file_name, 'rb') as f: raw_dataset = pickle.load(f) example_image = raw_dataset[0][0] num_classes = len(raw_dataset) dataset = np.empty((0, example_image.size)) labels = np.empty((0, 1)) for i_class in range(num_classes): num_images = len(raw_dataset[i_class]) for i_image in range(num_images): image = raw_dataset[i_class][i_image] features = image.flatten() dataset = np.vstack((dataset, features)) labels = np.vstack((labels, i_class)) return dataset, labels class Classifier: def __init__(self): # 初始化模型和数据 self.model = None # 下行代码从training_dataset.pkl文件读入训练数据,得到: #(1)训练数据 train_dataset:形状为(1000, 784)的ndarray #(2)训练数据的标签 train_labels:形状为(1000, 1)的ndarray self.train_dataset, self.train_labels = load_dataset('./step1/training_dataset.pkl') def train(self): # 训练模型 #********* BEGIN *********# #********* END *********# def predict(self, test_dataset): # 预测 ''' 输入:测试数据 test_dataset: 形状为(500, 784)的ndarray 输出:预测结果 predicted_labels: 形状为(500, )的ndarray ''' #********* BEGIN *********# #********* END *********# return predicted_labels #********* Begin *********# #********* End *********# #********* Begin *********# #********* End *********#
时间: 2025-05-30 20:11:41 浏览: 25
### 手写数字图像分类任务的替代算法
对于手写数字图像分类任务,除了卷积神经网络(CNN),可以采用其他复杂的机器学习算法来应对多种噪声类型的挑战。支持向量机(SVM)、随机森林以及集成方法(如XGBoost、LightGBM)都是有效的备选方案[^3]。
#### 支持向量机(SVM)
SVM是一种强大的监督学习模型,在高维空间中具有良好的泛化能力。它可以通过核函数(如线性核、多项式核或RBF核)映射输入数据到更高维度的空间,从而解决非线性可分问题。为了处理噪声影响,可以选择鲁棒性强的核函数并调整正则化参数C以平衡过拟合和欠拟合之间的关系[^5]。
```python
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
def svm_classifier(X_train_noisy, y_train, X_test_noisy, y_test):
# 初始化 SVM 模型 (使用 RBF 核)
model = SVC(kernel='rbf', C=1.0, gamma='scale')
# 训练模型
model.fit(X_train_noisy, y_train)
# 预测测试集标签
predictions = model.predict(X_test_noisy)
# 输出评估指标
acc = accuracy_score(y_test, predictions)
prec = precision_score(y_test, predictions, average='macro')
rec = recall_score(y_test, predictions, average='macro')
f1 = f1_score(y_test, predictions, average='macro')
return {"accuracy": acc, "precision": prec, "recall": rec, "f1-score": f1}
```
#### 随机森林
随机森林由多个决策树组成,通过投票机制决定最终类别归属。由于其内在特性,它可以很好地抵抗某些类型的噪声干扰,并且不需要过多的数据预处理工作。然而需要注意的是,当面对极端噪声情况时可能仍需额外优化超参设置[^3]。
```python
from sklearn.ensemble import RandomForestClassifier
def random_forest_classifier(X_train_noisy, y_train, X_test_noisy, y_test):
# 创建随机森林实例
rf_model = RandomForestClassifier(n_estimators=100, max_depth=None, min_samples_split=2, bootstrap=True)
# 开始训练流程
rf_model.fit(X_train_noisy, y_train)
# 对未知样本做出预测
preds_rf = rf_model.predict(X_test_noisy)
# 获取性能度量值
metrics_dict = {
'acc': accuracy_score(y_test, preds_rf),
'prec': precision_score(y_test, preds_rf, average="weighted"),
'rec': recall_score(y_test, preds_rf, average="weighted"),
'f1': f1_score(y_test, preds_rf, average="weighted")
}
return metrics_dict
```
#### 使用集成方法——XGBoost
作为一种梯度提升框架,XGBoost因其高效性和灵活性而广受欢迎。相比传统单一模型,它能更好地捕捉复杂模式并减少偏差误差。针对特定应用场景下的各种扰动因素,合理调节学习速率、最大深度等关键配置项有助于进一步提高抗噪水平[^4]。
```python
import xgboost as xgb
def xgboost_classifier(X_train_noisy, y_train, X_test_noisy, y_test):
dtrain = xgb.DMatrix(data=X_train_noisy, label=y_train)
dtest = xgb.DMatrix(data=X_test_noisy, label=y_test)
param = {'objective':'multi:softmax','num_class':10,'eta':0.1,'max_depth':6}
num_rounds = 100
bst = xgb.train(param,dtrain,num_rounds)
pred_probabilities = bst.predict(dtest).astype(int)
eval_metrics = dict()
eval_metrics['Accuracy'] = sum([int(a==b) for a,b in zip(pred_probabilities,y_test)]) / float(len(y_test))
eval_metrics['Precision'],eval_metrics['Recall'],eval_metrics['F-Score']=\
precision_recall_fscore_support(y_test,pred_probabilities,average='micro')[:3]
return eval_metrics
```
以上展示了三种不同的非CNN算法及其对应的Python实现方式。每种技术都有各自的优势与局限之处;实际项目开发过程中应依据具体需求选取最合适的解决方案。
阅读全文
相关推荐

















