共计 2735 个字符,预计需要花费 7 分钟才能阅读完成。
背景介绍
模式识别是西安电子科技大学计算机相关专业的核心课程之一,而上机作业是课程的重要组成部分。通过实践操作,学生能够深入理解课堂讲授的算法原理,并掌握其实现方法。本次作业采用 swanlab 作为实验管理工具,它能够帮助我们高效记录实验过程、可视化结果,并方便地进行版本对比。

swanlab 的主要作用体现在三个方面:
- 实验过程跟踪:自动记录超参数、指标变化
- 结果可视化:直观展示训练曲线、分类边界等
- 实验管理:方便比较不同参数下的模型表现
环境配置
Python 环境准备
推荐使用 Anaconda 创建独立的 Python 环境,避免包冲突。以下是具体步骤:
- 下载并安装 Anaconda(建议 Python 3.8+ 版本)
- 创建新环境:
conda create -n pattern_recognition python=3.8 - 激活环境:
conda activate pattern_recognition
安装必要依赖
pip install swanlab numpy scikit-learn matplotlib
验证安装
运行以下代码验证环境是否配置成功:
import swanlab
import sklearn
print("所有依赖安装成功!")
核心算法实现
KNN 算法实现
以下是 K 最近邻分类器的完整实现,包含详细注释:
import numpy as np
from collections import Counter
class KNN:
"""
K 最近邻分类器实现
参数说明:k: 最近邻数量,默认为 3
"""
def __init__(self, k=3):
self.k = k
def fit(self, X, y):
"""
训练方法,实际上 KNN 不需要显式训练
只是存储训练数据
"""
self.X_train = X
self.y_train = y
def predict(self, X):
"""
预测方法
对每个测试样本,计算它与所有训练样本的距离
然后找出 k 个最近邻,投票决定类别
"""
predictions = [self._predict(x) for x in X]
return np.array(predictions)
def _predict(self, x):
# 计算欧式距离
distances = np.sqrt(np.sum((self.X_train - x)**2, axis=1))
# 获取 k 个最近邻的索引
k_indices = np.argpartition(distances, self.k)[:self.k]
# 获取这些邻居的标签
k_nearest_labels = self.y_train[k_indices]
# 多数投票决定类别
most_common = Counter(k_nearest_labels).most_common(1)
return most_common[0][0]
SVM 算法实现
以下是使用 scikit-learn 实现 SVM 的示例:
from sklearn import svm
import swanlab
# 初始化 SVM 分类器
# C 是正则化参数,kernel 指定核函数类型
clf = svm.SVC(C=1.0, kernel='rbf', gamma='scale')
# 训练模型
clf.fit(X_train, y_train)
# 预测
predictions = clf.predict(X_test)
结果可视化
训练过程可视化
使用 swanlab 记录训练过程中的准确率和损失:
import swanlab
# 初始化 swanlab
swanlab.init(
experiment_name="pattern_recognition_exp",
description="KNN classifier with different k values"
)
# 在训练循环中记录指标
for epoch in range(epochs):
# ... 训练代码...
accuracy = calculate_accuracy()
loss = calculate_loss()
# 记录指标
swanlab.log({
"accuracy": accuracy,
"loss": loss
})
分类边界可视化
可视化 SVM 的分类边界:
import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay
# 创建决策边界可视化
DecisionBoundaryDisplay.from_estimator(
clf,
X_train,
response_method="predict",
plot_method="pcolormesh",
alpha=0.3,
)
# 绘制训练点
plt.scatter(X_train[:, 0], X_train[:, 1], c=y_train)
plt.title("SVM Decision Boundary")
# 保存到 swanlab
swanlab.log({"decision_boundary": swanlab.Image(plt)})
plt.close()
避坑指南
常见问题及解决方案
- 问题 1:数据未标准化导致算法性能差
-
解决方案:使用 StandardScaler 对数据进行标准化
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) -
问题 2:KNN 算法在大型数据集上运行缓慢
-
解决方案:
- 使用 KD 树或 Ball 树加速(sklearn 中的
algorithm参数) - 考虑降维或特征选择减少数据维度
- 使用 KD 树或 Ball 树加速(sklearn 中的
-
问题 3:SVM 对不平衡数据敏感
- 解决方案:
- 使用 class_weight 参数调整类别权重
- 对少数类进行过采样
进阶建议
算法优化方向
- 特征工程
- 尝试不同的特征选择方法(如方差阈值、互信息)
-
使用 PCA 或 t -SNE 进行降维可视化
-
模型调优
- 对 SVM 尝试不同的核函数和参数(使用 GridSearchCV)
-
对 KNN 尝试不同的距离度量(如曼哈顿距离、余弦相似度)
-
模型集成
- 尝试将 KNN 和 SVM 等不同模型集成
- 使用投票或堆叠方法
实验管理建议
- 为每个实验设置清晰的名称和描述
- 使用 swanlab 的对比功能分析不同参数的影响
- 定期保存模型和中间结果
总结
通过本文的指导,你应该已经掌握了模式识别上机作业的基本流程和关键技术要点。记住,模式识别不仅仅是完成作业要求,更重要的是理解算法背后的思想,并通过实践培养解决实际问题的能力。swanlab 作为一个强大的实验管理工具,能够帮助你更好地组织和管理实验过程。
在实际操作中遇到问题时,不妨多查阅官方文档和相关资料,或者与同学讨论交流。祝你在模式识别的学习道路上收获满满!
正文完
