2025年第十五届APMCM亚太地区大学生数学建模竞赛(中文赛项)C题解题思路(ChatGPT版)

包含全部问题分析和第一问具体代码建模 

总体任务概述

使用Iris数据集中前两类花(Setosa和Versicolor),通过以下流程实现分类:

  1. 构建若干个基于简单规则的弱分类器

  2. 将分类任务形式化为一个 QUBO模型

  3. 使用**Kaiwu SDK(模拟退火器)**求解,得到最终分类器,并进行性能分析。


🧩 问题1:数据预处理与弱分类器构建

🔹步骤1:加载与预处理

  • 使用Iris数据集中Setosa (0)Versicolor (1) 两类,共100个样本。

  • 每个样本4个特征:

    • sepal length(萼片长度)

    • sepal width(萼片宽度)

    • petal length(花瓣长度)

    • petal width(花瓣宽度)

🔹步骤2:预处理建议

  • 标准化(如 Z-score:mean=0, std=1)或归一化(0-1)

  • 随机划分训练集与测试集,如 80/20 分

🔹步骤3:弱分类器设计

  • 构造 MMM 个基于简单规则的弱分类器,例如:

    • 单特征 + 阈值(如:petal length > 2.5 → 类别1,否则类别0)

    • 两个特征组合的线性规则(如:a·feature1 + b·feature2 > threshold)

  • 将每个弱分类器输出转化为 {−1,+1}\{-1, +1\}{−1,+1}

  • 记录每个分类器在训练集上的准确率


🧩 问题2:QBoost建模与QUBO转化

🔹QBoost思想

  • 与传统Boosting不同,QBoost将弱分类器的选择转化为一个 QUBO问题(Quadratic Unconstrained Binary Optimization)

  • 每个弱分类器是否被选中由一个二进制变量 zj∈{0,1}z_j \in \{0, 1\}zj​∈{0,1} 表示。

🔹目标函数设计

  • 最小化分类误差 + 正则化项(避免过拟合,限制选择分类器数量):

min⁡z∥y−∑j=1Mzj⋅hj(x)∥2+λ⋅∑j=1Mzj\min_{\mathbf{z}} \left\| \mathbf{y} - \sum_{j=1}^M z_j \cdot h_j(\mathbf{x}) \right\|^2 + \lambda \cdot \sum_{j=1}^M z_jzmin​​y−j=1∑M​zj​⋅hj​(x)​2+λ⋅j=1∑M​zj​

其中:

  • y∈{−1,1}N\mathbf{y} \in \{-1, 1\}^Ny∈{−1,1}N 是训练样本的真实标签;

  • hj(x)h_j(\mathbf{x})hj​(x) 是第 j 个弱分类器的预测结果;

  • zj∈{0,1}z_j \in \{0, 1\}zj​∈{0,1} 是变量(是否选择该分类器);

  • λ\lambdaλ 是正则化参数。

🔹转换为QUBO形式

目标函数变换为标准 QUBO 形式:

min⁡z z⊤Qz+c⊤z\min_{\mathbf{z}} \ \mathbf{z}^\top Q \mathbf{z} + \mathbf{c}^\top \mathbf{z}zmin​ z⊤Qz+c⊤z

  • QQQ 为二次项矩阵;

  • ccc 为一次项向量;

  • 由误差平方项和正则项组合得到。


🧩 问题3:求解与模型评估(使用Kaiwu SDK)

🔹模拟退火求解

  • 使用 Kaiwu SDK(量子模拟平台)提供的模拟退火器

  • 输入构建好的 QUBO 参数 QQQ、ccc,得到最优解 z∗\mathbf{z^*}z∗;

  • 得到被选中的弱分类器集合。

🔹模型分析

  • 分析所选分类器的特征、阈值、组合逻辑;

  • 比较训练集与测试集的准确率;

  • 可进一步使用指标如:

    • 精确率(Precision)、召回率(Recall)、F1 分数;

    • 混淆矩阵;

    • ROC/AUC曲线(如果有必要)


🧪 实验与性能分析建议

  • 对不同正则参数 λ\lambdaλ 进行实验对比;

  • 分析弱分类器数量与准确率的关系;

  • 验证是否过拟合(训练集高准确但测试集下降);

  • 可尝试扩展特征工程(如PCA降维、特征交叉)观察效果变化。


 第一问建模

🧩 步骤1:数据加载与预处理

📌 内容:

  • 加载Iris数据集(sklearn.datasets.load_iris()

  • 选取前两类数据(Setosa 和 Versicolor)

  • 特征标准化(Z-score)

  • 划分训练集与测试集(如 80%:20%)

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import numpy as np
import pandas as pd

# 加载数据
iris = load_iris()
X = iris.data
y = iris.target

# 只保留 Setosa(0) 和 Versicolor(1)
X = X[y < 2]
y = y[y < 2]

# 标签映射为 {-1, 1}
y = np.where(y == 0, -1, 1)

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 划分训练和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)

print("训练集样本数:", len(X_train))

🧩 步骤2:弱分类器设计

📌 弱分类器定义:

使用以下两种方法生成 MMM 个弱分类器:

  1. 单特征+阈值型feature_j > t 判定为 +1 否则为 -1

  2. 两个特征线性组合a * feature_j + b * feature_k > t 判定为 +1 否则为 -1

我们可以枚举所有特征组合与多个阈值,构造出一组简单分类器。

def generate_weak_classifiers(X, num_thresholds=5):
    n_samples, n_features = X.shape
    classifiers = []
    thresholds = np.linspace(-2, 2, num_thresholds)  # 选取几个常规阈值

    for feature_idx in range(n_features):
        for t in thresholds:
            def classifier(x, idx=feature_idx, threshold=t):
                return 1 if x[idx] > threshold else -1
            classifiers.append(classifier)

    return classifiers

# 构建弱分类器集合
weak_classifiers = generate_weak_classifiers(X_train)
print(f"弱分类器总数:{len(weak_classifiers)}")

 🧩 步骤3:记录每个弱分类器在训练集上的预测与准确率

def evaluate_classifiers(classifiers, X, y):
    n_classifiers = len(classifiers)
    n_samples = len(y)
    H = np.zeros((n_classifiers, n_samples))  # 记录每个分类器的预测结果

    accuracies = []
    for j, clf in enumerate(classifiers):
        predictions = np.array([clf(x) for x in X])
        H[j] = predictions
        acc = np.mean(predictions == y)
        accuracies.append(acc)

    return H, np.array(accuracies)

H_train, acc_train = evaluate_classifiers(weak_classifiers, X_train, y_train)

# 展示前5个分类器的准确率
for i in range(5):
    print(f"分类器 {i+1} 的训练准确率:{acc_train[i]:.2f}")

 

✅ 总结:问题1已完成内容

模块说明
✅ 数据选择选取Setosa与Versicolor类,共100样本
✅ 数据预处理标准化特征 + 划分训练/测试集
✅ 弱分类器构建构造M个基于特征阈值的简单分类器
✅ 输出预测结果记录每个弱分类器对训练集的预测
✅ 准确率计算计算每个弱分类器在训练集上的准确率

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值