202012-2期末预测之最佳阈值

博客介绍了如何通过样例数据找出最佳阈值,以达到最高的预测准确率。首先确定了阈值的可能选择范围,然后根据规则逐步缩小范围,最终得出最佳阈值为3。内容还提到了测试数据的规模限制,并指出了解决思路,包括使用结构体和前缀和的方法,但目前的代码实现只获得了50分,需要进一步改进。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
样例1输入
6
0 0
1 0
1 1
3 1
5 1
7 1
样例1输出
3
样例1解释
按照规则一,最佳阈值的选取范围为0,1,3,5,7。
θ=0时,预测正确次数为4;
θ=1时,预测正确次数为5;
θ=3时,预测正确次数为5;
θ=5时,预测正确次数为4;
θ=7时,预测正确次数为3。
阈值选取为1或3时,预测准确率最高;
所以按照规则二,最佳阈值的选取范围缩小为1,3。
依规则三,θ*=max1,3=3。
样例2输入
8
5 1
5 0
5 0
2 1
3 0
4 0
100000000 1
1 0
样例2输出
100000000

子任务
70%的测试数据保证m<=200;
全部的测试数据保证1<=m<=105。

解决思路:
选定一个θ,小于θ,要等于0
,大于等于要等于1;
子任务的问题要单独定义,注意循环内部的条件问题;
还要对p进行单独排序;
目前代码仅仅50分,参考其他大佬答案,是使用结构体和前缀和来解决的。后续再修改。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5
### 关于最佳阈值的前缀和算法实现 在解决“期末预测最佳阈值”的问题时,可以采用前缀和的方法来优化计算效率。通过分析输入数据中的`result`数组以及对应的`y`值,我们可以利用前缀和的思想快速统计对于任意给定阈值θ,在该阈值下的预测正确次数。 #### 数据预处理 为了便于后续操作,先将所有的样本按照其安全指数`y`升序排列[^1]。这样做的好处是可以方便地分段统计每一段内的预测结果分布情况。 #### 计算前缀和 定义两个辅助数组用于存储累计的结果: - `prefix_zero[i]`: 表示从第一个样例到第i个样例中,实际结果为0的数量。 - `suffix_one[i]`: 表示从第i个样例到最后一个样例中,实际结果为1的数量。 这两个数组可以通过一次遍历完成初始化: ```python def calculate_prefix_and_suffix(a, n): prefix_zero = [0] * (n + 1) suffix_one = [0] * (n + 1) count_zero = 0 for i in range(n): if a[i][1] == 0: # result is zero count_zero += 1 prefix_zero[i + 1] = count_zero count_one = 0 for i in range(n - 1, -1, -1): if a[i][1] == 1: # result is one count_one += 1 suffix_one[i] = count_one return prefix_zero, suffix_one ``` 上述函数实现了基于排序后的列表`a`构建所需的前缀零计数器和后缀一计数器[^3]。 #### 遍历求最大正确率 有了这些准备之后,我们就可以枚举每一个可能作为阈值的安全指数,并依据之前建立好的前缀和关系迅速得出对应条件下的总正确预测数目: ```python max_correct = 0 best_theta = None for i in range(len(a)): current_y = a[i][0] correct_before = prefix_zero[i] # Number of zeros before this y value. correct_after = suffix_one[i] # Number of ones after or at this y value. total_correct = correct_before + correct_after if total_correct > max_correct: max_correct = total_correct best_theta = current_y ``` 此部分逻辑的核心在于理解如何分割区间并有效运用已有的统计数据得到全局最优解[^2]。 #### 总结 最终返回的最佳阈值即为我们所找到的最大化预测准确度的那个特定数值。这种方法不仅提高了时间复杂度上的表现,还简化了代码结构使其更加清晰易懂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值