题目要求我们按照给定公式,使用NGD,也就是归一化梯度下降,来优化目标函数:
f(w)=21∣Xw−y∣22+λ∣w∣22对应梯度为:
仅使用 numpy,手写实现一种简化变体优化器 NGD (Normalized Gradient Descent)。
与标准 GD 不同,NGD 先把梯度归一化为单位 L2 向量,再按衰减学习率更新:
设目标
f(w)=21∥Xw−y∥22+λ∥w∥22,X∈Rn×d,y∈Rn.
梯度
∇f=X⊤(Xw−y)+2λw.
归一化
g^=max(∥∇f∥2,ε)∇f.
其中 ε=1e−10 为梯度范数阈值。若 ∥∇f∥2<ε 或出现 NaN/Inf(通过 np.isfinite ),跳过本次更新并进入下一步迭代(仍计步),以避免数值不稳定。
学习率
ηt=tη0,其中t=1,2,…,T。
更新
wt+1=wt−ηtg^.
你需要用到的参数:
参数 数值
η0 0.2
λ 0.01
迭代步数 T 60
计算完 wT 后,对测试集做线性输出 y^=Xtest wT 并取 sign(结果 ≥0 取 1,否则 0)。
单行 JSON:
{
"train_X": [[...], ...], // n×d
"train_y": [...], // 长度 n(实数)
"test_X": [[...], ...] // m×d
}
n≤60, m≤15, d≤6
所有值为实数;不含缺失
仅一行 JSON:
{
"weights": [w1, w2, ...], // 长度 d,保留 6 位小数,使用 round(x, 6) 即可
"test_pred": [0/1, ...] // 长度 m
}
1.权重初始化:w0=0d。
2.对数域或动量均不需要,严格按上述公式迭代 60 步即可。
3.梯度归一化若出现 ∥∇f∥2=0,请跳过更新。
4.为确保通过测试用例,仅允许使用 numpy 实现。
输入
{"train_X":[[0,0],[0.2,0.1],[0.1,-0.1],[4,4],[4.1,3.9]],"train_y":[0,0,0,1,1],"test_X":[[0.05,0.05],[4.05,4.05]]}
输出
{"weights":[0.075281,0.138912],"test_pred":[1,1]}