通过率 0% · 提交 0 · 通过 0
给定完整训练样本,用带偏置项的岭回归训练线性模型,再对每个只缺失一个特征的样本,根据给定目标值恢复这个特征。偏置项不参与正则化。
本题要求训练参数唯一确定。令 Z 为每行特征前添加常数 1 后的设计矩阵,R 的对角线为 0、1、…、1,参数满足 (ZᵀZ + λR)β = Zᵀy。保证该方程组有唯一解;当 λ=0 时,Z 的列必须线性无关。
恢复时,若缺失列的模型权重绝对值小于 10^-10,输出 NA;否则从线性模型中解出该缺失特征。NA 仅表示这个权重不足以按规定恢复特征,不是训练方程奇异时的通用答案。
这类题属于算法机考高频题型中「华为 AI 岗 / 岭回归」方向的高频题型,通常考察对「华为 AI 岗 / 岭回归」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
第一行输入三个整数 n d m。第二行输入实数 lambda。接下来 n 行,每行输入 d 个特征值和一个标签 y。随后 m 行,每行输入 d 个特征值和一个目标值 y,其中恰好一个特征位置为 ?。 特征和标签的有效小数位数不超过 6 位,lambda 的有效小数位数不超过 14 位;允许等价的科学计数法,以展开为普通十进制并去除末尾无意义零后的有效小数位数计。
输出 m 行。若缺失列权重绝对值小于 1e-10,输出 NA;否则输出恢复的缺失特征值,保留四位小数。绝对值小于 0.00005 的结果输出为 0.0000。
d <= 8;1 <= n <= 200;1 <= m <= 100;0 <= lambda <= 100;特征和标签绝对值不超过 10000。保证法方程唯一可解:lambda=0 时,包含偏置列的设计矩阵满列秩。需要输出的数不落在四位小数的舍入中点。特征和标签的有效小数位数不超过 6 位,lambda 的有效小数位数不超过 14 位;允许等价的科学计数法,以展开为普通十进制并去除末尾无意义零后的有效小数位数计。
示例 1
输入示例
5 2 2 0.01 0 0 2.000000 1 0 5.000000 0 1 1.000000 2 1 7.000000 -1 2 -3.000000 ? 1 7 2 ? 5
输出示例
2.0030 2.9917
二维样本恢复缺失特征
示例 2
输入示例
4 2 1 0.1 0 0 5.000000 1 0 7.000000 2 0 9.000000 3 0 11.000000 2 ? 9
输出示例
NA
目标几乎不受缺失列影响时输出 NA
时间限制 3000 ms · 内存限制 256 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
这些是真正决定能不能 AC、但通用题解里常被略过的点。
构造法方程,偏置对应的第零个对角元不加 λ。解出参数后,若缺失第 j 列,令 known 为偏置与其他已知特征贡献之和,恢复值为 (target - known) / weight[j]。
存在解不等于唯一解。λ=0 且两列特征重复时,多个参数向量可以得到相同训练预测,却对缺失特征给出不同恢复值,因此本题明确要求唯一解。λ>0 且至少有一条样本时,系数矩阵正定;λ=0 时需含偏置设计矩阵满列秩。
参考实现从输入字符串构造有理数,精确建立和求解方程,避免把很小的非零主元误判成零,也不在读取时丢失十进制低位。Python 使用 Fraction,Java 使用 BigInteger 保存分子、分母,C++ 使用程序中自带的大整数类保存分子、分母,仅依赖标准 C++17,无需额外安装库。大整数按多位整数完成加减乘除,有理数运算保留精确值。精确消元寻找非零主元;唯一解保证每一步都能找到。系数与阈值的比较、最后四位小数的舍入也使用整数或有理数完成。
按算术操作次数计,构造 O(n·d²),消元 O(d³),恢复 O(m·d);有理数实际运算成本还取决于输入数字及中间分子、分母的位数,不把任意精度运算当作固定成本。
"""Solve the unique regression model with exact rational arithmetic."""
import sys
from fractions import Fraction
def gauss(a, rhs):
size = len(rhs)
for col in range(size):
pivot = next((r for r in range(col, size) if a[r][col] != 0), None)
if pivot is None:
raise ValueError('The training equation must have a unique solution')
a[col], a[pivot] = a[pivot], a[col]
rhs[col], rhs[pivot] = rhs[pivot], rhs[col]
div = a[col][col]
for j in range(col, size):
a[col][j] /= div
rhs[col] /= div
for r in range(size):
if r == col:
continue
factor = a[r][col]
if factor == 0:
continue
for j in range(col, size):
a[r][j] -= factor * a[col][j]
rhs[r] -= factor * rhs[col]
return rhs
def format_four(value):
if abs(value) < Fraction(1, 20000):
return '0.0000'
magnitude = abs(value)
q, r = divmod(magnitude.numerator * 10000, magnitude.denominator)
if 2 * r >= magnitude.denominator:
q += 1
sign = '-' if value < 0 and q else ''
return f'{sign}{q // 10000}.{q % 10000:04d}'
def solve(text):
data = iter(text.split())
first = next(data, None)
if first is None:
return ''
n, d, queries = int(first), int(next(data)), int(next(data))
lam = Fraction(next(data))
size = d + 1
a = [[Fraction(0) for _ in range(size)] for _ in range(size)]
rhs = [Fraction(0) for _ in range(size)]
for _ in range(n):
row = [Fraction(1)] + [Fraction(next(data)) for _ in range(d)]
target = Fraction(next(data))
for i in range(size):
rhs[i] += row[i] * target
for j in range(size):
a[i][j] += row[i] * row[j]
for i in range(1, size):
a[i][i] += lam
weights = gauss(a, rhs)
output = []
for _ in range(queries):
row = [next(data) for _ in range(d)]
target = Fraction(next(data))
missing = row.index('?')
coefficient = weights[missing + 1]
if abs(coefficient) < Fraction(1, 10**10):
output.append('NA')
continue
known = weights[0] + sum(weights[j+1] * Fraction(value)
for j,value in enumerate(row) if j != missing)
output.append(format_four((target - known) / coefficient))
return '\n'.join(output)
if __name__ == '__main__':
result = solve(sys.stdin.read())
if result:
print(result)
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有