【发布时间】:2019-07-02 23:30:08
【问题描述】:
我有一个任务让我很头疼。我已经生成了一种算法,可以将颜色分类到箱/子组中。我想评估它与 人类直觉 相比的效果如何。所以我创建了一些颜色列表(我的数据)并手动将它们分类到我认为算法应该如何对颜色进行排序的箱/子组中(我的基本事实)。然后我将这些相同的颜色列表(我的数据)提供给算法,并将其排序与我的基本事实进行比较。
这就是我的问题。我不知道如何最好地将基本事实与结果进行比较,以评估算法的运行情况。谁能提供有关如何比较 2 个颜色列表的建议?
以下是基本事实和算法结果的示例。我需要比较这 2 个不同的颜色列表,以查看结果与基本事实(左侧)的接近程度。 如您所见;箱的数量变化,每个箱的长度是可变的,每个箱中的颜色顺序是可变的。唯一不变的是两个列表将始终具有相同数量的颜色(它们的排序方式不同)。这就是为什么要弄清楚如何比较它们变得如此复杂(至少对我来说)。
输入数据示例,即提供给颜色分类器的颜色列表:
[[69,99,121],[59,91,103],[71,107,140],[97,132,162],[85,117,141],[94,136,153],[86,131,144],[65,99,118],[211,214,2191],[204,20], [203,207,188],[194,199,180],[219,215,200],[214,206,195],[197,188,191],[197,188,192],[186,197,180],[206,197,181],[206,196,183],[38,35,31],[5 ,5,12],[31,34,41],[42,39,34],[30,32,27],[12,8,9]]
颜色分类器的示例输出(上面的颜色已被分类到 4 个 bin/sub-groups):
[ [[69,99,121],[59,91,103],[71,107,140],[97,132,162],[85,117,141],[94,136,153],[86,131,144],[65,99,118]], [[211,214,201],[204,204,191],[203,207,188],[215,216,203],[194,199,180]], [[222,215,200],[219,213,195],[214,206,191],[197,188,172],[186,177,160],[206,197,181],[206,196,183]], [[38,35,31],[5,5,12],[31,34,41],[42,39,34],[30,32,27],[12,8,9]] ]
注意:如果您认为这样更容易比较,我可以轻松地将排序颜色的格式更改为其他格式(如 numpy 数组或直方图)。请注意直方图,每个 bin 的数量需要相同,因此我可能需要填充其中一个列表。
当子列表顺序无关紧要且子列表长度如此多变时,如何比较这两个 python 列表?
编辑 澄清问题:我想我已经解决了 bin 比较(见下面的代码)。问题是如何知道从ground truth 中的哪个bin 与结果中的哪个bin 进行比较。例如,在上面的图像中,我需要比较来自地面实况(左侧)的 bin 2 和来自结果(右侧)的 bin 1,即比较它们每个的橙色 bin。当结果中没有 bin 可与基本事实进行比较时,也会出现问题。
def validator(result_bin, ground_truth_bin):
# todo: padd the shorter bin with black values so each is the same length
dists = cdist(result_bin, ground_truth_bin, 'euclidean')
correct_guesses = np.sum(dists<25, axis=1)
score = float(len(correct_guesses)) / len(ground_truth_bin)
return score
【问题讨论】: