我试图设计一种算法,可以找到最适合超集中定义的正确数字集的数字范围。我已经在下方添加了一张图片,希望能够准确地澄清我的意思。
上述问题的一个理想解决方案是范围 [2-5] ,这将产生以下结果:
我确实没有针对该算法定义的性能指标,但我认为这将是一个良好的开端:
^^以上应该是' +'不是减号。
暴力强迫并不理想,因为这些集合可能包含数千个数字。我目前的想法是平均正确的设置和加/减标准差,但必须有更好的方法。
答案 0 :(得分:1)
无论你最终决定什么指标,如果花费O(n)时间来计算长度为n的范围的度量,那么这可以在O(n ^ 3)时间内求解为最优:你需要做的就是对数字(O(n log n))进行排序,然后对于此范围内的每个O(n ^ 2)可能(起始编号,结束编号)组合,按每个组合的O(n)时间计算您的指标。
事实上,大多数指标可以在恒定时间内递增计算,因此您可以在不太麻烦的情况下获得整体O(n ^ 2)。例如。您所声明的指标(BTW,我同意可能不是最好的,因为0可以很容易地出现在分母中)可以非常容易地递增计算:对于范围(a,b),记录正确猜测的计数和计数不正确的猜测;从这两个数字计算您的指标只是一个减法和一个除法。然后计算范围(a,b + 1)的答案,只需增加这两个总数中的任何一个是合适的。
我会推荐什么指标? Jaccard index,始终在0和1之间,特别是始终已定义,前提是您要比较的两个集合中至少有一个(此处为范围内的数字,你的"定义的正确集合中的数字")有超过0个元素。
<强> [编辑:强> 如果您的指标具有完全合理的属性使范围扩大到超出必要范围从未使其更好,那么您可以比在输入中尝试所有数字对更好:您只需要尝试所有对正确集合中的数字。如果正确的设置远小于总输入,这将是一个巨大的胜利。 的 强>
答案 1 :(得分:1)
我怀疑cosine similarity可能是比较两个多重集(计数器)的更好的指标(如果计算成本更高)。但是,您需要调整A [i]和B [i]的值。
如果A是正确的多重集,而B是多重集,则需要考虑的是少数情况,大多数情况都不会出现在您的示例中,因此不确定这些情况的相关程度。< / p>
接近结束时,似乎最好使用B&#39;和A&#39;代替B和A代表某些k&gt; = 1且c&gt; = 1.根据以下Pythonic伪代码计算。
Version 1:
A' = 0
if A[i] == B[i]:
if A[i] == 0:
B'[i] = 0
else:
B'[i] = c
else:
B'[i] = (A[i] - B[i])^k
似乎k = 1或k = 2会起作用。虽然c可以根据范围的大小来计算。
如果B [i]不等于A [i]的事实使得差异不公正,则公式简化为:
Version 2
A' = 0
if A[i] == B[i]:
if A[i] == 0:
B' = 0
else:
B'[i] = c
else:
B'[i] = b
其中b和c只是一些常数而c>湾我认为在c = 1和b = 1或c = 0且b = 1的情况下,版本2缩减为Jaccard索引.Jaccard索引的问题是如果你说A [5] == B [5] == 1和A [10000] == B [10000] == 1作为唯一的两个元素。范围[5,10000]的Jaccard指数为1.这可能实际上不是问题,但需要考虑。