Testing 参数扫描:根据输出对参数进行排序

Testing 参数扫描:根据输出对参数进行排序,testing,sorting,parameters,combinations,Testing,Sorting,Parameters,Combinations,我试图为我的算法找到最佳的三元组参数组合。对于每个可能的组合,我都有几个结果。现在,我首先按照成功的最高数量,以以下方式对每个元组(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

我试图为我的算法找到最佳的三元组参数组合。对于每个可能的组合,我都有几个结果。现在,我首先按照成功的最高数量,以以下方式对每个元组(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))
…这意味着对于tuple(x,y,z),我的成功率是1.0100倍,成功率是0.820倍,等等

现在,我担心这种排序是幼稚的,因为它没有考虑到,例如在
(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;
(当然,如果总的_结果总是恒定的,这可以简化,正如上面的示例所示)

这将为您的示例提供以下等级:

(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

谢谢是的,我确保每个参数组合的结果数总是相同的。我在寻找一个你刚才给出的一般答案,但在我的特殊情况下,我知道输出值应该始终为1.0,所以首先对其进行赋值并不是完全错误的。不过,我担心所有剩余的输出,尤其是当存在大量低值时。也许我应该坚持对(1.0,事件)进行排序,然后对剩余值应用类似于您的方法的东西。你认为呢?当然,如果1.0那么重要,那么你建议的混合方法(按1.0结果的#排序,然后按所有非1.0结果的加权和排序)似乎是合理的-因此(x,y,z)将是首选方法,因为大多数1.0结果,其次是(x2,y2,z2),其中1.0更少,但所有其他结果的总和为0.472,然后是(x1,y1,z1)与x2相同的1.0,但总和为0.46。我仍然担心一个可能的情况,最高的数字为1.0,也最高的数字为0.0。我该怎么处理呢?应该会有某种程度的破坏,对吧?正如我所说,答案很大程度上取决于你想要得到什么样的结果。如果您更喜欢一种算法,该算法产生的结果略少于1.0,而得到的结果却少于0.0,那么您只需要以某种方式将其合并到排序中。有几种可能性:1)第一步或第二步是按“#of 1.0结果-#of 0.0结果”排序,2)在总和中为0.0结果分配负权重,以便它们主动计数,而不是不进行贡献;3)按“#of 0.0结果”预先排序,并在继续排序之前预先排除前N个结果。