我有一个棘手的问题,我需要对齐两个数组的峰值。通常这不会“棘手”,但在这种情况下,一个比另一个短,而较短的一个可以被分段。此外,解决方案不能具有重叠段。为了说明,这里有两个零对齐的向量(这不是一个“真实”的情况,本身,但它确实证明了想法):
这是(大致)我想如何对齐它们:
当然,您可以想象多种解决方案是可行的 - 因此它实际上只是一个搜索优化问题 - 即找到产生最佳拟合的间距。
我有一种可以很好地工作的分割方法,而且我还有一种方法可以评估优先考虑轮廓和峰值差异的位置(即,而不是整体差异),这适合我的用例。
我制作的第一个对齐算法是贪婪的,虽然它解决了这个示例问题,但我意识到在某些情况下(可能很多!)它将无法解释所有段,因为它将耗尽空间在考虑所有这些之前转入。所以我可以看到我必须尝试多个位置,评估它们并选择最好的位置,但我试图避免测试太多......一种方法可以应用这篇文章中的技术:{{3}根据整数的分区(即原始矢量的长度差)来布局段之间的空间。但是,对于我的示例问题,这个差异是10,这意味着尝试2 ^(10-1)= 512种可能的安排,我认为这对我的应用来说有点沉重。
任何想法(技术,启发式)都将不胜感激。我在Swift工作,但这不是一个重要的细节。
更新:所以,在@templatetypedef(序列对齐,动态编程)的引导下,我设法得到了一些非常好的东西。根据以下内容填写对齐矩阵:
https://math.stackexchange.com/a/1787380
其中:
并且 s 和 q 都已归一化为[0,1]。手工完成这个,我得到这样的东西:
非常好!所以,感谢@templatetypedef让我指向了正确的方向。
值得注意的是,这并不是“紧凑”,因为缩放矢量,构建原始矩阵,提取路径,然后重新格式化最终序列都需要相当多的迭代。另一方面,我之前的想法也会有缩放,分割,计算间距排列,对齐和评估,挑选最优的一个,以及格式化结果......当然,这种方法的好处是,它是已建立,和它还会处理 s 和 q 长度相等的情况(这是一个非常重要的奖励)。
我可以弄清楚实现,但如果有人有任何提示,请随时发表评论。
更新
考虑到“匹配”分数的计算,我注意到-1的“空位罚分”太高了。在-0.5的情况下,我能够得到不错的结果。