我有两个项目序列:
S1 = [A B C D E F]
S2 = [1 2 3 4 5 6 7 8]
我可以将每对项目(s1,s2)的“相似性”确定为一个数字(例如,从0到10的小数位数)。
我想找到S1 / S2项之间的映射,这样可以保留每个序列的排序,并且映射项之间的“相似”值之和最大。不需要所有S1 / S2项都属于映射。
示例:
[ A B C D E F ]
[ 1 2 3 4 5 6 7 8 ]
在上面的示例中,映射“ A on 3”,“ D on 4”和“ F on 6”给出了整体最大的“相似性”。
是否有任何现有的问题(/算法)可以解决?
答案 0 :(得分:2)
您描述的问题看起来像Longest Common Subsequence Problem变体。
使用此循环关系代替原始关系:
ans[i][j] = max(
ans[i-1][j],
ans[i][j-1],
ans[i-1][j-1] + similarity(S1[i], S2[j])
)
答案 1 :(得分:2)
像Smith-Waterman算法(它通常用于确定两个核酸序列或蛋白质序列字符串之间的相似区域)的外观应该很完美:
Smith-Waterman算法通过匹配/不匹配(也称为替换),插入和删除来比对两个序列。插入和删除都是引入间隙的操作,这些间隙用短划线表示。 Smith-Waterman算法有几个步骤:
确定替换矩阵和空位罚分方案。替换矩阵为每对项目(s1,s2)分配匹配或不匹配的分数。通常情况下,比赛获得正分,而失配则获得相对较低的分。空位罚分函数确定打开或扩展空位的得分成本。建议用户根据目标选择合适的评分系统。此外,尝试替换矩阵和空位罚分的不同组合也是一个好习惯。
初始化得分矩阵。得分矩阵的维数分别是每个序列的1+长度。第一行和第一列的所有元素都设置为0。额外的第一行和第一列使在任何位置将一个序列与另一个序列对齐是可能的,并将它们设置为0可以使末端间隔不受惩罚。 / p>
- 得分。考虑替换的结果(对角分数)或增加差距(水平和垂直分数),从矩阵的左到右,从上到下对每个元素评分。如果所有分数均不为正,则此元素将为0。否则,将使用最高分数并记录该分数的来源。
- 跟踪。从得分最高的元素开始,基于每个得分的源递归地进行追溯,直到遇到0。在此过程中,将基于给定的评分系统生成具有最高相似性评分的细分。要获得次佳的局部对齐方式,请从最佳对齐方式的轨迹之外的第二个最高分开始应用回溯过程。
只需选择匹配矩阵即可
我可以将每对项目(s1,s2)的“相似性”确定为一个数字(例如,从0到10的小数位数)。
并将差距和不匹配罚分设为零
我想找到S1 / S2项之间的映射,这样可以保留每个序列的排序,并且映射项之间的“相似”值之和最大。不需要所有S1 / S2项都属于映射。
更多信息,请访问:https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm#Scoring_matrix