本题使用对数几率模型,也就是逻辑回归,并按照题目要求使用全批量梯度下降算法训练参数。
首先将训练集的标签与读数分开,并在每条读数最左侧补上一个常数 1,作为偏置项。权向量 θ 初始化为全 0。
每轮训练执行以下步骤:
实验室质检组要把一批已经人工复核过的样品仪器读数做成达标 / 超标判定器,再给当晚待检样品打标签。规程要求必须只用 numpy 手写对数几率模型,并且每一轮用全部训练样品算一次梯度再更新参数,不能换成现成分类库,也不能改成随机小批量。学习率、轮数、正则系数和数值截断都写在当班工艺卡上,必须原样执行。
每条训练记录是一组读数 ui 和一个标签 ti∈{0,1},其中 0 表示达标,1 表示超标。测试记录只有读数、没有标签。实现时在读数最左侧拼一列全 1 作为偏置,得到增广向量
uˉi=[1,ui,1,ui,2,…,ui,k]
权向量 θ 从全 0 开始。记 si=θ⊤uˉi,再把 si 截断到 [−30,30](防止指数溢出)。通过率定义为
qi=σ(si)=1+e−si1
其中 σ 为 Sigmoid。每一轮用全部 N 条训练样品做一次更新:
∇=N1(uˉ1(q1−t1)+uˉ2(q2−t2)+⋯+uˉN(qN−tN)),θ←θ−η⋅∇
固定口径:学习率 η=‘0.2‘;迭代轮数 T=8×102;L2 正则系数为 0.0。预测规则:若 q≥‘0.5‘ 则判为 1,否则判为 0。本题不使用随机数,因此无需设置随机种子。为保证通过测试用例,仅允许使用 numpy。
约束:
1 < N < 2×1011 < Q < 2×1010 < k < 6标准输入为一行 JSON,形如 {"train": [[...features...,t],...],"test": [[...features...],...]}。
train:二维列表,共 N 行。每行最后一列是标签 t(只取 0 或 1),其余列是读数;1 < N < 2×101test:二维列表,共 Q 行,只含读数,维数 k 与训练一致;1 < Q < 2×101,0 < k < 6标准输出仅一行:一个 JSON 数组,长度为 Q,表示测试集预测标签(每个值是 0 或 1),顺序与 test 一致,例如 [0,1,1]。
输入
{"train": [[2, 0], [3, 0], [8, 1], [9, 1]], "test": [[1], [2], [6], [9]]}
输出
[0, 0, 1, 1]
说明
2、3 标为达标 0,8、9 标为超标 15.09 附近1、2 判为 0,测试点 6、9 判为 1输入
{"train": [[0, 1, 0], [1, 0, 0], [5, 1, 1], [6, 2, 1]], "test": [[0, 0], [6, 1], [3, 1]]}
输出
[0, 1, 1]
说明
0.5,后两个大于 0.5,所以预测为 0、1、1输入
{"train": [[1, 0], [2, 0], [7, 1]], "test": [[1], [4], [8]]}
输出
[0, 0, 1]
说明
4.144 的通过率约为 0.445,尚未达到 0.5,因此判为 0;1 同样为 0,8 为 1
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.