我的一项任务确实让我很沮丧。我产生了一种算法,可以将颜色分类到箱/子组中。我想评估它与人类直觉相比效果如何。因此,我创建了一些颜色列表(我的数据),并手动进行了遍历并将它们分类到箱/子组中,以了解我认为算法应如何对颜色进行排序(我的基本事实)。然后,我将这些相同的颜色列表(我的数据)提供给算法,并将其排序与我的基本情况进行比较。
这就是我的问题。我不知道如何最好地将真实性与结果进行比较,以评估算法的效果。谁能提供有关如何比较两种颜色列表的建议?
以下是基本事实和算法结果的示例。我需要比较这2种不同的颜色列表,以查看结果与地面真相的距离(左侧)。如您所见,仓数变化,每个仓的长度是可变的,并且每个仓中的颜色顺序是可变的。唯一的常数是两个列表将始终具有相同数量的颜色(它们将以不同的方式排序)。因此,这就是为什么它变得如此复杂(至少对我而言),以找出如何比较它们的原因。 / p>
示例输入数据,即输入颜色分类器的颜色的公正列表:
[[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]]
颜色分类器的输出示例(上面的颜色已分为4个bin /子组):
[ [[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数组或直方图)。请注意,使用直方图,每个垃圾箱的数量必须相同,因此我大概需要填充其中一个列表。
当子列表顺序无关紧要且子列表长度是如此可变时,如何比较这两个python列表?
编辑问题的澄清:我认为我已经比较了bin比较(请参见下面的代码)。问题是如何知道将地面真相中的哪个bin与结果中的哪个bin进行比较。例如,在上面的图像中,我需要将来自地面真实情况的分箱2(左侧)与来自结果的分箱1(右侧)进行比较,即,比较每个中的橙色分箱。当结果没有垃圾箱可与地面真实情况进行比较时,也会出现问题。
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
答案 0 :(得分:0)
RGB是人类色彩感知的非常不合适的表示。
转换为HSV或Lab。然后您可以使用例如每个颜色对cosine similarity。
由于列表的长度不同,因此可以通过多种方式查找要比较的对。我可以提出一些建议。
对于较长列表中的每种颜色,请在较短列表中找到最接近的颜色;使用差异向量的欧几里得长度作为标量。
对于较短列表中的每种颜色,请在较长列表中找到最接近的颜色,按上述方法测量差异,然后将其从较长列表中删除。现在您又有了两个列表,重复此过程。现在,您有了差异度量的列表;通过运行次数(算术或几何平均值)对其求平均值。
希望这会有所帮助。