多分类加权指标计算

[牛客链接](https://www.nowcoder.com/practice/dec560ebcd8c47c9a37f6df692c38d25)

思路

本题是机器学习中经典的多分类评估指标计算问题,需要根据预测标签和真实标签,计算加权精确率(Precision)、召回率(Recall)和 F1 分数。

核心步骤:

  1. 逐类统计混淆矩阵元素:对每个类别 ,遍历所有样本,统计:

- :预测为 且真实也为 的样本数

- :预测为 但真实不为 的样本数

- :真实为 但预测不为 的样本数

  1. 计算每类指标

- ,分母为 0 时结果为 0

- ,分母为 0 时结果为 0

- ,分母为 0 时结果为 0

  1. 加权聚合:将每类指标乘以对应权重 后求和,得到最终的加权精确率、召回率和 F1 分数。

以样例为例:

  • 类别 0:,precision=1.00,recall=0.75,f1≈0.86
  • 类别 1:,precision=0.50,recall=0.50,f1=0.50
  • 类别 2:,precision≈0.33,recall=0.50,f1=0.40

加权后:precision = ,以此类推。

整个过程就是按定义直接模拟计算即可,没有特殊的算法技巧,关键在于正确处理分母为 0 的边界情况。

代码

def main():
    pred = list(map(int, input().split()))
    true = list(map(int, input().split()))
    weights = list(map(float, input().split()))

    n_classes = len(weights)

    wp = 0.0
    wr = 0.0
    wf = 0.0

    for c in range(n_classes):
        tp = sum(1 for p, t in zip(pred, true) if p == c and t == c)
        fp = sum(1 for p, t in zip(pred, true) if p == c and t != c)
        fn = sum(1 for p, t in zip(pred, true) if t == c and p != c)

        prec = tp / (tp + fp) if (tp + fp) > 0 else 0.0
        rec = tp / (tp + fn) if (tp + fn) > 0 else 0.0
        f1 = 2 * prec * rec / (prec + rec) if (prec + rec) > 0 else 0.0

        wp += weights[c] * prec
        wr += weights[c] * rec
        wf += weights[c] * f1

    print(f"{wp:.2f} {wr:.2f} {wf:.2f}")

main()

复杂度分析

  • 时间复杂度,其中 为类别数, 为样本数。对每个类别遍历一次所有样本。
  • 空间复杂度,存储预测和真实标签数组。