关键词:MNIST数据集、SVM、神经网络、模型对比
python
# 第一部分:使用Scikit-learn的SVM识别手写数字 from sklearn import datasets, svm, metrics from sklearn.model_selection import train_test_split # 加载MNIST数据集 digits = datasets.load_digits() X, y = digits.images.reshape((len(digits.images), -1)), digits.target # 数据预处理 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 创建SVM分类器 clf = svm.SVC(gamma=0.001) clf.fit(X_train, y_train) # 预测与评估 y_pred = clf.predict(X_test) print(f"分类报告:\n{metrics.classification_report(y_test, y_pred)}")
输出示例:
text
precision recall f1-score support 0 1.00 1.00 1.00 33 1 1.00 1.00 1.00 28 2 1.00 1.00 1.00 33 3 1.00 0.97 0.99 34 ... accuracy 0.99 360
python
# 第二部分:使用PyTorch实现神经网络 import torch import torch.nn as nn import torch.optim as optim # 定义神经网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(64, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 转换数据为Tensor X_train_t = torch.FloatTensor(X_train) y_train_t = torch.LongTensor(y_train) # 训练模型 model = Net() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.01) for epoch in range(100): optimizer.zero_grad() outputs = model(X_train_t) loss = criterion(outputs, y_train_t) loss.backward() optimizer.step()
关键结论:
SVM在小型数据集上准确率达99%
神经网络通过特征自动提取获得更强泛化能力
参数量对比:SVM(支持向量) vs NN(权重矩阵)