我正在尝试为我的算法找到最佳的三元组参数组合。对于每种可能的组合,我都有几个结果。现在我首先按照最高成功次数对每个元组 (x,y,z) 进行排序,方法如下:
(x,y,z): ((1.0, 100 times), (0.8, 20 times), (0.5, 200 times), (0.0, 10 times))
(x1,y1,z1): ((1.0, 80 times), (0.9, 100 times), (0.5, 50 times), (0.0, 100 times))
(x2,y2,z2): ((1.0, 80 times), (0.9, 20 times), (0.5, 200 times), (0.0, 30 times))
...这意味着对于元组 (x,y,z),我的成功率为 1.0 100 次,成功率为 0.8 20 次,等等。
现在,恐怕这样的排序是天真的,因为它没有考虑到,例如在 (x1,y1,z1)
中有大量的失败(0.0 ) 以及大量成功 (1.0)。
我应该如何考虑这一点?
最佳答案
答案很大程度上取决于您对“最佳”的定义!您是希望有一种算法始终在 100% 的时间内给出 0.8 的成功,还是在 80% 的时间内给出 1.0 的成功而在 20% 的时间内给出 0.0 的失败,或者对于您的目的而言,这些算法是否等效?
您可以采用的一种非常简单的方法是对结果进行加权求和,如下所示:
rank = 0;
total_results = 0;
for each (success_rate, number_of_results_at_this_rate) in this_data; do
rank += (success_rate * number_of_results_at_this_rate);
total_results += number_of_results_at_this_rate;
done
rank = rank / total_results;
(当然,如果 total_results 始终保持不变,这可以简化,就像在上面的示例中一样)
这将为您的示例提供以下排名:
(x,y,z) = (100 + 16 + 100 + 0) / (100+20+200+10) = about 0.65
(x1,y1,z1) = (80 + 90 + 25 + 0) / (80+100+50+100) = about 0.59
(x2,y2,z2) = (80 + 18 + 100 + 0) / (80+20+200+30) = 0.6
关于testing - 参数扫描 : rank parameters according to output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12056799/