#P4597. 第2题-加一平滑对数判别器
-
1000ms
Tried: 189
Accepted: 25
Difficulty: 5
所属公司 :
美团
时间 :2026年3月14日-算法岗
第2题-加一平滑对数判别器
解题思路
这道题按照题意直接模拟即可,使用的算法是加一平滑对数判别器二分类。
已知:
train中每一行最后一列是标签y∈{0,1}- 前面的列是每个特征维度的非负整数特征值
test中只有特征值
题目内容
你需要实现一个基于计数特征的二分类预测算法。给定训练样本集与测试样本集,训练集的每条样本由 m 个非负整数特征值和一个类别标签(0 或 1)组成;测试集的每条样本仅包含 m 个特征值。请严格按照以下步骤计算每个测试样本的预测类别:
-
令 Nc 为训练集中类别 c 的样本数(c∈{0,1}),总样本数 N=N0+N1。先验对数为:
lnπc=lnNNc -
对每个类别 c 和每个特征维度 j(1≤j≤m),记 nc,j 为类别 c 中所有样本在第 j 个特征上的取值之和。使用加一平滑估计特征条件概率:
P(j∣c)=∑k=1m(nc,k+1)nc,j+1并计算其对数 lnP(j∣c)。
-
对于一个测试样本 x=(x1,…,xm),定义其属于类别 c 的对数得分:
Sc=lnπc+j=1∑mxj⋅lnP(j∣c) -
比较两类的得分:若 S1≥S0,则预测该样本为 1,否则预测为 0。
注意:为保证运行环境一致,请在程序开始时固定随机种子(例如 numpy.random.seed(42))。
约束条件:
- 训练集样本数 N 不超过 104,特征维度 m 不超过 500。
- 所有特征值均为非负整数,单个样本的特征值总和不超过 106。类别标签为 0 或 1。
- 训练集中两个类别均至少包含一个样本(即 N0>0 且 N1>0)。
- 测试集样本数 K 不超过 104,特征维度与训练集一致。
输入描述
输入为单个 JSON 对象,可能跨越多行。该对象包含两个字段:
"train":一个二维列表,形状为 Nimes(m+1)。每一行由 m 个非负整数特征值与一个类别标签(0或1)组成,标签位于行末。"test":一个二维列表,形状为 Kimesm。每一行包含 m 个非负整数特征值。
特征维度 m 对所有行保持一致,且满足上述约束。
输出描述
输出一个 JSON 数组,按顺序包含 K 个整数,依次表示每个测试样本的预测类别(0 或 1)。
样例1
输入
{"train":[[2,0,0],[1,1,0],[0,2,1],[0,1,1]],"test":[[1,0],[0,1],[0,0]]}
输出
[0,1,1]
说明
训练集有 4 条样本,特征维度 m=2。类别计数:N0=2,N1=2,N=4;先验对数均为 lnπ0=lnπ1=ln0.5≈−0.6931。
类别 0 内特征求和:n0,1=2+1=3,n0,2=0+1=1,平滑分母 ∑k(n0,k+1)=3+1+2=6。条件概率对数:lnP(1∣0)=ln63+1=ln64≈−0.4055,lnP(2∣0)=ln61+1=ln62≈−1.0986。
类别 1 内特征求和:n1,1=0+0=0,n1,2=2+1=3,平滑分母 0+3+2=5。条件对数:lnP(1∣1)=ln50+1=ln0.2≈−1.6094,lnP(2∣1)=ln53+1=ln0.8≈−0.2231。
测试样本 [1,0]:S0=−0.6931+1imes(−0.4055)=−1.0986,S1=−0.6931+1imes(−1.6094)=−2.3025,S0>S1,预测 0。样本 [0,1]:S0=−0.6931+1imes(−1.0986)=−1.7918,S1=−0.6931+1imes(−0.2231)=−0.9163,S1>S0,预测 1。样本 [0,0]:S0=S1=−0.6931,满足 S1≥S0,预测 1。
样例2
输入
{"train":[[0,0],[2,1],[3,1]],"test":[[0],[10],[5]]}
输出
[1,1,1]
说明
训练集 N=3,N0=1,N1=2。先验对数 lnπ0=ln(1/3)≈−1.0986,lnπ1=ln(2/3)≈−0.4055。
特征维度 m=1。类别 0 特征总和 n0,1=0,平滑分母 0+1=1,lnP(1∣0)=ln1=0。类别 1 特征总和 n1,1=2+3=5,平滑分母 5+1=6,lnP(1∣1)=ln(6/6)=ln1=0。
因此对于任意测试样本,条件概率得分为 0,最终得分仅由先验决定:S0=−1.0986,S1=−0.4055。由于 S1>S0,所有测试样本均预测 1。
样例3
输入
{"train":[[1,0,2,0],[0,3,1,0],[2,2,0,1],[0,1,3,1],[1,0,1,1]],"test":[[1,1,1],[2,0,0],[0,2,1]]}
输出
[1,1,0]
说明
训练集特征维度 m=3,样本数 N=5(N0=2,N1=3)。先验对数 lnπ0=ln0.4≈−0.9163,lnπ1=ln0.6≈−0.5108。
类别 0 内特征求和:n0,1=1+0=1,n0,2=0+3=3,n0,3=2+1=3。平滑分母 ∑(n0,k+1)=1+3+3+3=10。条件对数:lnP(1∣0)=ln(2/10)≈−1.6094,lnP(2∣0)=ln(4/10)≈−0.9163,lnP(3∣0)=ln(4/10)≈−0.9163。
类别 1 内特征求和:n1,1=2+0+1=3,n1,2=2+1+0=3,n1,3=0+3+1=4。平滑分母 3+3+4+3=13。条件对数:lnP(1∣1)=ln(4/13)≈−1.1787,lnP(2∣1)=ln(4/13)≈−1.1787,lnP(3∣1)=ln(5/13)≈−0.9555。
测试样本 [1,1,1]:S0=−0.9163+(−1.6094−0.9163−0.9163)=−4.3583,S1=−0.5108+(−1.1787−1.1787−0.9555)=−3.8237,S1>S0,预测 1。样本 [2,0,0]:S0=−0.9163+2imes(−1.6094)=−4.1351,S1=−0.5108+2imes(−1.1787)=−2.8682,S1>S0,预测 1。样本 [0,2,1]:S0=−0.9163+2imes(−0.9163)+1imes(−0.9163)=−3.6652,S1=−0.5108+2imes(−1.1787)+1imes(−0.9555)=−3.8237,此时 S0>S1,预测 0。