本次任务是一个手写数字分类任务,要求在 train.npz 训练数据上,基于 Kernel + SVM 实现一个手写体识别模型,模型输入为 28×28像素的灰度手写数字图片,输出为 0~9 共10类数字标签。请实现 SVM 的核心算法逻辑,通过合理的特征工程与参数选择提升模型性能。
✨ 1. 独立实现 Kernel + SVM 分类模型对手写数字图片进行分类,对比多项式核和高斯核效果。
✨ 2. 根据混淆矩阵,分析当前SVM算法瓶颈。
✨ 3. 独立实现机器学习模型的核心算法逻辑,不得调用任何外部机器学习库。
❌ 禁止使用的库
- sklearn / scikit-learn
- tensorflow
- torch / pytorch
- keras
- xgboost
- lightgbm
- catboost
- statsmodels
- libsvm
- liblinear
- shotgun
- thundersvm
- cuml
- 训练集:
data/train.npz
train.npz文件包含两个数组:X_train和y_trainX_train:6800张28×28像素的灰度手写数字图片y_train:图片对应的数字标签,取值范围为 0~9
下面是一个手写数字"3"的28×28像素灰度图像示例:
array([0.78 0. 0.64 0. 0. 0.42 0. 0.57 0.29 0. 0. 0. 0. 0.74
0. 0.08 1. 0. 0. 0.07 0. 0. 0.13 0.27 0. 0. 0. 0. ]
[0.32 0. 0. 1. 0. 0. 0.25 0.28 0.6 0. 0. 0. 0. 0.61
0.01 0.78 0.11 0. 0.11 0. 0. 0. 0. 0. 0.05 0. 0.1 1. ]
[0. 1. 0.81 0.61 0. 0. 0. 0. 0. 0. 0. 1. 1. 1.
0.77 0.39 0.88 0.71 0.12 0.84 0.05 1. 0. 0.67 0. 0. 0.22 0.02]
[0.75 0. 0. 0. 0.83 0. 0.26 0. 0.29 0.92 1. 1. 1. 1.
1. 0.26 0. 0. 0.75 0.52 0.67 0. 0.06 0. 0.67 0.11 0. 0.09]
[0.4 0. 1. 0. 0. 0.84 0. 0.04 0.73 0. 0.42 1. 0.38 0.21
0. 0.31 0. 0.11 0.08 0.58 0. 0.78 0.03 0.22 0.22 0. 0. 0. ]
[0. 0.84 0.94 0. 0. 0. 0.46 0.52 0. 1. 1. 0.65 1. 1.
0.57 1. 0. 0.74 0.37 0.87 0. 0. 1. 0.3 0.57 0.46 0.73 0. ]
[0.05 0.37 0.58 0.38 0.14 1. 0. 0.35 0. 1. 0.77 1. 0.99 0.89
0.36 1. 0. 0. 0.13 0. 0.08 1. 0. 0.72 0.31 0. 0. 0.24]
[0.13 0.06 0. 0.63 0. 0. 0.4 0.42 1. 1. 0.26 0.26 0.62 1.
0.26 0.88 0. 0.17 1. 0. 0.17 0.43 0.93 0.67 0. 0.53 0. 0. ]
[0. 0.03 0. 0.32 0. 1. 0.09 1. 0. 0.25 0. 0.15 1. 0.18
0.5 0.69 0.56 1. 1. 0.98 0.54 0. 0.46 0. 0. 0.95 0. 0.56]
[0. 0. 0. 0.26 0. 0.22 0.02 0.7 1. 0.22 0. 1. 0.51 1.
1. 1. 0.37 0. 1. 1. 0.72 0.64 0.42 0. 0. 0. 1. 1. ]
[0. 0. 0. 0. 0.31 0.49 0.28 0. 0. 0. 0.47 1. 0.96 0.19
1. 0.34 0.42 0.03 0.08 0.46 1. 0.48 0.23 0. 0. 0.96 0.51 0. ]
[0.1 0.69 0. 0. 0.03 0.26 0.2 0.34 0. 0.91 1. 1. 1. 0.72
0.11 0.5 0. 0. 0.61 0.78 0.83 1. 0.2 0. 0.2 0. 0. 0.77]
[0.93 0.61 0. 0. 0. 0. 0. 0.11 0.46 0. 1. 0.41 1. 1.
0.41 0.11 0. 0. 0. 0. 0.68 1. 0. 0. 0. 1. 0. 0.05]
[0.57 0. 0.08 0.79 0. 1. 0.06 0.56 0. 1. 0.82 1. 1. 0.67
0.09 0.62 0. 0.68 0. 0. 0.82 1. 0. 0.45 0. 0. 0.8 0.76]
[0. 0. 0. 0. 0.19 0.25 0. 0. 0.23 0. 0.17 1. 1. 0.
0.68 0. 0.29 1. 1. 0. 0.55 1. 0.17 0.22 0. 0.05 0. 0. ]
[0.28 0. 0. 1. 0. 0. 0.57 1. 0. 1. 1. 1. 0.49 0.24
0. 0. 0. 1. 0.21 0. 0. 1. 0.34 0.19 0.26 0. 0. 0.27]
[0.12 0.24 0. 0. 0. 0.04 0. 0. 0.19 0.89 0.81 0. 0.34 0.
0. 0. 0. 0. 0.06 0.79 0.83 1. 0. 0.53 0. 0.9 0.42 0. ]
[0.28 0. 0. 0. 1. 0. 0. 0. 0. 0. 0.41 0.46 0. 0.
0. 0.66 0. 1. 0.72 1. 1. 0.84 0.71 0.28 0. 0. 0. 0.27]
[0.38 0.26 0.19 0.33 0.22 0.03 0. 0. 1. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0.09 1. 1. 0.86 0.1 0. 0.78 0.27 0.37 0. ]
[0. 0.83 0. 1. 0. 0. 0.21 0.32 0. 0. 1. 0. 0.14 0.2
0. 0.71 0.49 0.26 0.23 1. 0.74 1. 0. 0.04 0. 0.31 0. 0. ]
[1. 0.22 1. 1. 0.25 1. 0. 0.18 0.21 0.76 0.1 1. 0. 0.95
0. 0. 0.93 0.6 1. 0.52 0. 0. 0.07 0. 0. 0. 0. 0.01]
[0.34 0. 0.4 0.69 0. 0.1 0. 0.89 0. 0.49 0. 0. 0. 0.
0.03 0.33 0.69 0.84 1. 0.92 0. 0. 0. 0. 0. 0. 0.97 0.69]
[0. 0. 1. 0. 0. 0.16 0.39 0.34 0.14 0. 0. 0. 0.59 0.08
0.02 1. 0.01 0.99 0.89 0.87 0.12 0. 0. 1. 1. 0.97 0. 1. ]
[0. 0. 1. 0. 0.63 0. 0. 0. 0.38 0.75 0.62 0. 0.31 0.8
0. 0. 0. 1. 0. 0. 0. 0.36 0. 0.9 0.41 0.14 0.03 0. ]
[0. 0. 0.76 0. 0. 0. 0. 0. 0. 0.14 0.75 0.9 0.56 0.79
1. 1. 1. 0. 0. 0. 0. 0.08 0. 0. 0.17 0.79 0. 0. ]
[0. 0. 0. 1. 0. 0. 0. 0.25 0. 0. 0.42 1. 0.25 0.25
1. 1. 0. 0.34 0. 0. 0. 0.47 0. 0. 0.66 1. 0.63 0.88]
[0. 0.78 0. 1. 0. 0.13 0. 0. 0.19 0. 0.12 0.46 0. 0.17
0. 0. 0. 0.21 0. 0. 0. 0.03 0. 0.12 0.76 0.51 0.91 0.87]
[0.28 0.66 0. 0. 0. 0. 0. 0. 0. 0. 0.59 0. 1. 0.
0. 0.53 0.53 0. 0.31 0. 0.75 0.68 0.55 0.45 0. 0.04 0. 0. ])| 特征 | 说明 |
|---|---|
| 图像尺寸 | 28×28像素 |
| 颜色空间 | 灰度(0-1浮点数) |
| 数据范围 | 0.0(白色)到 1.0(黑色) |
| 样本数量 | 6800个训练样本 |
| 类别数量 | 10个数字(0-9) |
- Accuracy:分类准确率
- Confusion Matrix:混淆矩阵(展示各类预测混淆情况)
- Prediction_Time:预测时间(秒)
⚡ 评测使用 10个并发线程 对测试集进行预测
位次排序逻辑:Accuracy高 -> 推理时间短 -> 最近提交时间远
🏆 20分 - Metric得分(基于Accuracy值)
采用线性变换的方式计算分数:
| 🌟 等级 | 📍 标准 | 💯 得分 |
|---|---|---|
| 前10%学生 | leaderboard第10%分位的Accuracy | 20分 (满分) |
| 中间学生 | 在10%分位线和baseline之间 | 6-20分 (线性插值) |
| Baseline | baseline的Accuracy | 6分 |
| 未提交 | - | 0分 |
📦 project/
┣ 📄 data/train.npz # 训练数据
┣ 🔧 model.py # 模型实现
┣ 🚀 solution.py # 推理接口
┣ 📋 requirements.txt # 依赖库
┣ 🐧 evaluate-linux # Linux评测程序
┣ 🍎 evaluate-macos # macOS评测程序
┗ 🪟 evaluate-win.exe # Windows评测程序
💡 Baseline: Logistic regression模型,你需要实现自己的SVM模型
class Model:
def __init__(self):
"""初始化模型所需参数、变量或结构(如权重、缓存等)"""
def fit(self, X, y):
"""
模型训练函数
Args:
X: numpy数组, shape (n_samples,H,W)
y: numpy数组, shape (n_samples,)
Returns:
None
"""
# 在此处实现模型训练逻辑(可自由设计模型结构与训练方式)
def predict(self, X):
"""
模型预测函数
Args:
X: numpy数组, shape (n_samples, n_features)
Returns:
numpy数组, shape (n_samples,)
"""
# 在此处实现推理逻辑,返回每个样本的预测类别
class Solution:
def __init__(self):
"""初始化推理类,加载并训练模型"""
self.model = Model()
# 可加载训练数据并训练模型
# self.model.fit(X_train, y_train)
def forward(self, sample: np.ndarray) -> dict:
"""
模型推理接口,接收单条样本数据并返回预测结果
Args:
sample: numpy数组, shape (H,W)
Returns:
dict: {'prediction': int},预测类别
"""
x = sample.reshape(1, -1)
y_pred = self.model.predict(x)
return {"prediction": int(y_pred[0])}📦 依赖安装:
conda create -n ML python=3.10
conda activate ML
pip install -r requirements.txt📖 点击查看详细步骤
- 🔗 进入GitHub仓库
- 🏷️ 点击 release 标签
- ⬇️ 下载对应系统的文件:
- 🐧 Linux: evaluate-linux
- 🍎 macOS: evaluate-macos
- 🪟 Windows: evaluate-win.exe
⚠️ 重要:将下载的评测程序放在项目根目录(与solution.py、model.py同级)
🐧 Linux/macOS:
export STUDENT_ID='你的学号'
export STUDENT_NAME='你的姓名'
export STUDENT_NICKNAME='你的昵称'
export MAIN_CONTRIBUTOR='human'(or 'ai')💾 持久化:添加到~/.bashrc或~/.zshrc
🪟 Windows:
set STUDENT_ID=你的学号
set STUDENT_NAME=你的姓名
set STUDENT_NICKNAME=你的昵称
set MAIN_CONTRIBUTOR=human(or ai)💾 持久化:系统设置 → 环境变量
🐧 Linux(ubuntu 24.02)
chmod +x evaluate-linux
./evaluate-linux🍎 macOS
chmod +x evaluate-macos
./evaluate-macos
⚠️ macOS 首次运行提示:若系统提示 “无法打开,因为它来自身份不明的开发者”,请按以下步骤操作: 点击弹窗中的 “取消”; 打开系统设置(System Settings) → 进入隐私与安全性(Privacy & Security); 在页面下方 “安全” 区域找到 “evaluate-macos 已被阻止打开” 的提示,点击右侧 “仍要打开”; 在确认窗口中再次点击 “打开”,即可正常运行。
🪟 Windows
evaluate-win.exe📊 实时排名显示
📈 详细指标展示
🔄 未提交同学显示
⏰ 支持多次提交,以截止日期前的最佳成绩为准
📅 记得在11月17日0:00前提交你的最佳成绩!
Made with ❤️ for Machine Learning Education
