# ML-Assignment-2
**Repository Path**: kute1654/ML-Assignment-2
## Basic Information
- **Project Name**: ML-Assignment-2
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-11-06
- **Last Updated**: 2025-11-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Assignment 2: 手写体分类任务
[](https://www.python.org/)
[](http://101.132.193.95:3000)
[](LICENSE)
**📅 截止日期:11月17日** | **🏆 [查看排行榜](http://101.132.193.95:3000)**
---
## 📋 任务概述
> 本次任务是一个手写数字分类任务,要求在 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_train`
- `X_train`:6800张28×28像素的灰度手写数字图片
- `y_train`:图片对应的数字标签,取值范围为 0~9
---
### 🎨 数据示例
下面是一个手写数字"3"的28×28像素灰度图像示例:
**手写数字"3"的像素灰度图**
#### 对应的数值矩阵
```python
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分
🏆 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模型
---
## 💻 模型实现
### 🎨 1. `model.py` - 模型类
```python
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,)
"""
# 在此处实现推理逻辑,返回每个样本的预测类别
```
### 🚀 2. `solution.py` - 推理接口
```python
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])}
```
---
## ⚙️ 环境要求



**📦 依赖安装**:
```bash
conda create -n ML python=3.8
conda activate ML
pip install -r requirements.txt
```
---
## 🚀 运行评测
### 📥 1. 下载评测程序
📖 点击查看详细步骤
1. 🔗 进入GitHub仓库
2. 🏷️ 点击 [release](https://github.com/LZlzLzzlzl/ML-Assignment-2/releases/tag/v1.0.0) 标签
3. ⬇️ 下载对应系统的文件:
- 🐧 **Linux**: [evaluate-linux](https://github.com/LZlzLzzlzl/ML-Assignment-2/releases/tag/v1.0.0/evaluate-linux)
- 🍎 **macOS**: [evaluate-macos](https://github.com/LZlzLzzlzl/ML-Assignment-2/releases/tag/v1.0.0/evaluate-macos)
- 🪟 **Windows**: [evaluate-win.exe](https://github.com/LZlzLzzlzl/ML-Assignment-2/releases/tag/v1.0.0/evaluate-win.exe)
> ⚠️ **重要**:将下载的评测程序放在**项目根目录**(与solution.py、model.py同级)
### ⚙️ 2. 设置环境变量
**🐧 Linux/macOS:**
```bash
export STUDENT_ID='你的学号'
export STUDENT_NAME='你的姓名'
export STUDENT_NICKNAME='你的昵称'
export MAIN_CONTRIBUTOR='human'(or 'ai')
```
💾 持久化:添加到`~/.bashrc`或`~/.zshrc`
**🪟 Windows:**
```cmd
set STUDENT_ID=你的学号
set STUDENT_NAME=你的姓名
set STUDENT_NICKNAME=你的昵称
set MAIN_CONTRIBUTOR=human(or ai)
```
💾 持久化:系统设置 → 环境变量
### ▶️ 3. 运行评测
**🐧 Linux(ubuntu 24.02)**
```bash
chmod +x evaluate-linux
./evaluate-linux
```
**🍎 macOS**
```bash
chmod +x evaluate-macos
./evaluate-macos
```
> ⚠️ macOS 首次运行提示:若系统提示 “无法打开,因为它来自身份不明的开发者”,请按以下步骤操作:
> 点击弹窗中的 “取消”;
> 打开系统设置(System Settings) → 进入隐私与安全性(Privacy & Security);
> 在页面下方 “安全” 区域找到 “evaluate-macos 已被阻止打开” 的提示,点击右侧 **“仍要打开”**;
> 在确认窗口中再次点击 “打开”,即可正常运行。
>
**🪟 Windows**
```cmd
evaluate-win.exe
```
---
## 🏆 Leaderboard
### 🌐 访问地址
**🔗 [http://101.132.193.95:3000](http://101.132.193.95:3000)**
---
### ✨ 功能特性
📊 实时排名显示
📈 详细指标展示
🔄 未提交同学显示
⏰ 支持多次提交,以截止日期前的最佳成绩为准
---
### 🎉 祝你取得好成绩!
**📅 记得在11月17日前提交你的最佳成绩!**
---
Made with ❤️ for Machine Learning Education