这道题要求在只使用 numpy 的前提下,手写实现二分类的 Logistic Regression,并且训练方法固定为 IRLS,也就是迭代重加权最小二乘。
设训练集特征矩阵为 X,标签为 y,参数为 w。
为了表示截距项,需要先在特征矩阵最左侧拼接一列全 1。这样模型形式为:
某数据分析任务需要根据一组数值特征预测二分类结果。训练数据中每行由多个特征和一个二元标签组成,标签值为 0 或 1。你需要实现一个带截距项的线性分类模型,并使用加权最小二乘迭代估计参数。实现时只能使用 numpy 和 pandas。
设训练特征矩阵为 X,最左侧增加一列全 1 作为截距项。参数向量 w 初始化为零向量。对当前 w,先计算每个训练样本的概率 pi=σ(xi⋅w),其中 σ(z)=1/(1+e−z)。令 p 为所有 pi 组成的向量,对角矩阵 W 的对角元为 pi(1−pi)。每次迭代更新:
其中 y 为训练标签向量,ϵ=10−6,I 为单位矩阵。当 ∥w′−w∥2<10−6 时停止,或最多迭代 30 次。
预测时,对测试特征矩阵同样在最左侧增加一列全 1,计算 p^i=σ(xi⋅w^)。若 p^i≥0.5,则预测标签为 1,否则为 0。
保证所有输入数值均为整数或浮点数,无缺失项;训练集标签只为 0 或 1;测试集特征列数与训练集特征列数相同。
标准输入只有一行,包含一个 JSON 对象。该对象包含两个键:train 和 test。train 是二维数组,每一行由若干数值特征和一个标签组成,标签为该行最后一个元素,取值为 0 或 1;test 是二维数组,仅包含数值特征,列数与 train 的特征列数相同。所有数值均为整数或浮点数,无缺失值。
输出一行 JSON 数组,数组中的每个元素为对应测试样本的预测类别(0 或 1),顺序与输入 test 中样本顺序一致。
输入
{"train": [[0, 0], [1, 1]], "test": [[0.2], [0.8]]}
输出
[0, 1]
说明
训练集包含两个样本:特征 0 的标签为 0,特征 1 的标签为 1。使用带截距项的逻辑回归进行 IRLS 拟合时,由于两类线性可分,算法会学习到将 0.5 附近的特征值作为分界。
对于测试样本特征 x,预测概率为 p^=σ(w^0+w^1x)。当测试特征为 0.2 时,p^<0.5,预测为 0;当测试特征为 0.8 时,p^≥0.5,预测为 1。最终输出 [0,1]。
输入
{"train": [[1.0, 2.0, 0], [2.0, 3.0, 0], [5.0, 6.0, 1], [6.0, 5.0, 1]], "test": [[1.5, 2.5], [5.5, 5.5]]}
输出
[0, 1]
说明
训练集中负类样本的特征大致位于 (1.0,2.0) 和 (2.0,3.0),正类样本位于 (5.0,6.0) 和 (6.0,5.0),两类在特征空间上线性可分。
经过 IRLS 迭代后,模型学习到的线性决策边界可以将两组样本分开。测试样本 (1.5,2.5) 位于负类一侧,其预测概率 p^<0.5,预测为 0;测试样本 (5.5,5.5) 位于正类一侧,其预测概率 p^≥0.5,预测为 1。输出 [0,1]。
输入
{"train": [[0.5, 0], [1.0, 0], [1.5, 0]], "test": [[0.8], [2.0], [1.2]]}
输出
[0, 0, 0]
说明
该边界情况中,训练集所有标签都是 0。IRLS 从初始概率 0.5 开始,根据标签 0 不断向下调整预测概率,使模型倾向于输出负类。
测试样本特征分别为 0.8、2.0、1.2,经过训练后的 sigmoid 函数计算得到的概率均小于 0.5,因此全部预测为 0。最终输出 [0,0,0]。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册