SP5104 SPAMD - Spam Detection

题目描述

众所周知,「free」这个词语的出现次数可以用来区分垃圾邮件和非垃圾邮件。你的任务是基于邮件中「free」出现的次数设计一个垃圾邮件检测模块。这个模块的核心是一个垃圾邮件分类器,定义为两个变量 $Low$ 和 $High$。如果邮件中包含 $X$ 个「free」单词,并且 $Low \le X \le High$,则该邮件将被视为垃圾邮件。 为了评估分类器的效果,我们引入了一些信息检索中的术语: | 实际情况 | 垃圾邮件 | 非垃圾邮件 | |:--------:|:-------:|:---------:| | 预测结果 | TP(真正例)| FP(假正例) | | | FN(假负例)| TN(真负例) | TP 是正确预测为垃圾邮件的邮件数量;FN 是错误预测为非垃圾邮件的邮件数量,其他情况以此类推。 我们用精确率(P)表示正确识别垃圾邮件的比例,公式为:$P = \frac{TP}{TP + FP}$。 召回率(R)则表示成功识别垃圾邮件的比例,公式为:$R = \frac{TP}{TP + FN}$。为了在精确率和召回率之间取得平衡,我们使用 F 值,其公式为:$F = \frac{2 \times P \times R}{P + R}$。 举个例子,当 TP = 5, FP = 3, FN = 2, TN = 4 时,R = 5/7,P = 5/8,F = 2/3。 在没有垃圾邮件的情况下,我们可以将所有邮件标记为非垃圾邮件,F 值为 1.0,代表完美的分类器。 我们的数据挖掘团队已经手动分析了一些邮件,并将它们标记为垃圾邮件或非垃圾邮件。你的任务是找到使分类效果(F 值)最佳的 $Low$ 和 $High$ 值。

输入格式

输入由多个测试用例组成,每个用例包含两行: - 第一行是整数 $N$,表示某个邮件中「free」词语的最大数量($1 \le N \le 10^6$)。 - 第二行包含四个整数 $a_0, A, B, M$,是随机数生成器的参数($2 \le a_0, A, B, M \le 10^9$)。 随机数生成器生成的数列为: $$a_i = (A \times a_{i-1} + B) \mod M \text{ 对 } i \ge 1$$ 定义如下: $$\text{pos}_i = a_{2i} \quad (0 \le \text{pos}_i < N)$$ $$\text{neg}_i = a_{2i+1} \quad (0 \le \text{neg}_i < N)$$

输出格式

对于每个用例,输出能获得最佳 F 值的分类器的 F 度量(保留到小数点后 6 位)。

说明/提示

- $1 \le N \le 10^6$ - $2 \le a_0, A, B, M \le 10^9$ **样例输入** ``` 3 1 1 1 3 5 2 3 4 5 ``` **样例输出** ``` 0.666667 0.923077 ``` **样例解释** 在第一个测试用例中,随机数生成器产生的序列为 1, 2, 0, 1, 2, …。垃圾邮件的数量为 $\text{pos}_i = \{1, 0, 2, 1\}$,非垃圾邮件为 $\text{neg}_i = \{2, 1, 0, 2\}$。 最优的分类器将「free」词数在 2 到 3 之间的邮件视为垃圾邮件,此时 R = 3/4,P = 3/5,结果 F = 2/3。另一种生成最优分类器的方法是仅将包含 2 个「free」词的邮件视为垃圾邮件。 **本翻译由 AI 自动生成**