网易 9 月 29 日机考笔试:加权 F 分数与三种梯度下降实现
- 轮次
- 笔试
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
笔试(9 月 29 日机考)
- 质检加权评分:外观工位把样品分为有疵点(1)与完好(0)两类,检测模型给出判定,只给正类打分。记模型与人工都标成 1 的件数为 tp、模型标 1 而人工标 0 的为 fp、模型标 0 而人工标 1 的为 fn;精确率 P = tp / (tp + fp)、召回率 R = tp / (tp + fn),任一分母为 0 时该项记 0;分数 S = (1 + w²)·P·R / (w²·P + R),分母为 0 时 S = 0。输入为权重系数 w、模型判定序列与人工标注序列,输出按四舍五入保留 3 位小数
- 分批均方下降:用无偏置的线性模型拟合数据(预测值为自变量行与系数的内积),误差取残差平方的均值,当前一刀有 b 行时梯度 g = (2 / b) · Aᵀ · e,每步做 θ ← θ − α·g。给定走法 kind、步长 α、轮数 T、每刀最多行数 B、初始系数 θ、读数 y 与自变量表 A,按 full(每轮全部行当一刀)、point(每轮逐行更新)、block(每轮切成连续的小批,最后一刀不足 B 行也要更新)三种走法执行 T 轮,输出最终系数,每个数保留 8 位小数
《参考解析》
-
第一题就是 Fβ 分数,边界条件才是考点:S 是精确率与召回率的加权调和平均,w 相当于 β,w 越大越看重召回(漏检的代价越高)。实现上左右同时扫描两组序列,只累计 tp(都为 1)、fp(模型 1、人工 0)、fn(模型 0、人工 1)三类计数,两边都为 0 的样本不进入分子分母。三个边界必须处理:
tp + fp = 0时 P 记 0、tp + fn = 0时 R 记 0、整个分母为 0 时 S = 0;当 tp = 0 时分子自然为 0,结果也是 0。另外可以把它化简成闭式S = (1 + w²)·tp / (w²·(tp + fn) + (tp + fp))(tp > 0 时与定义等价),少做两次除法也能避免浮点误差累积。输出用四舍五入(round(s * 1000) / 1000或十进制quantize,注意 Python 的round是银行家舍入,靠它直接格式化可能差在末位),最后按%.3f输出。 -
第二题是把批量、随机、小批量三种梯度下降写在同一份代码里:三种走法共用同一套更新逻辑,区别只在「怎么切刀」——full 每轮切一刀(全部 p 行,即批量梯度下降),point 每轮按行号切 p 刀(每次一行,即随机梯度下降),block 每轮按行号切成连续小批、每批最多 B 行、最后一批不足 B 行照样更新(即小批量梯度下降)。容易写错的地方有三个:残差必须是「预测减读数」而不是反过来,方向写反会朝错误方向更新;梯度里的 2 / b 不能漏(少了常数倍的步长会让收敛速度不对,甚至因步长等效变大而发散);block 的最后一批如果因为「不足 B 行」被跳过,结果必然不对。按题目给出的样例(full、α = 0.1、T = 1、θ 初始全 0、数据三行),一轮更新后系数应为
[0.93333333 0.93333333],写完先用它自检。 -
工程细节决定这题能不能拿到分:输入格式是带方括号和逗号的自定义列表(第二题第一行还带引号),别指望
cin >> double能直接解析,稳妥做法是整行读入后用正则或逐字符过滤出数字/小数点/负号再stod;要注意[1,0,1]这类整数列表和浮点矩阵共用同一套解析逻辑时,负号与指数符号(e、E)都要保留。输出格式同样严格:第一题定点三位小数,第二题每个数八位小数、用空格分隔并套一层方括号。复杂度上第一题 O(n)、第二题 O(T·p·q)(p 不超过 200、q 不超过 10、T 不超过 200,直接三重循环即可,不需要向量化)。机考里这类「题面不复杂但格式严格」的题,失分基本都在输入解析、浮点精度与输出格式上,先把这三个点写稳再考虑优化。