我正在尝试为我的算法找到最好的3元组参数组合。我对每种可能的组合都有几个结果。现在我按照最高的成功次数,按照以下方式耙每个元组(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)。
我应该如何考虑这一点?
答案 0 :(得分:1)
答案很大程度上取决于你对“最佳”的定义!您是否愿意拥有一种算法,该算法在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