【问题标题】:Fast way find strings within hamming distance x of each other in a large array of random fixed length strings快速方法在大量随机固定长度字符串中找到彼此汉明距离 x 内的字符串
【发布时间】:2018-11-12 14:39:37
【问题描述】:

我有一个包含数百万个全部 24 个字符长的 DNA 序列的大型阵列。 DNA 序列应该是随机的,并且只能包含 A、T、G、C、N。我正在尝试找到彼此在一定汉明距离内的字符串。

我的第一种方法是计算每个字符串之间的汉明距离,但这需要很长的时间。

我的第二种方法使用掩码方法来创建字符串的所有可能变体并将它们存储在字典中,然后检查是否发现此变体超过 1 次。对于 1 的汉明距离,这工作得非常快(20 分钟),但是非常占用内存,并且不适用于 2 或 3 的汉明距离。

Python 2.7 实现我的第二种方法。

sequences = []
masks = {}
for sequence in sequences:
    for i in range(len(sequence)):
        try:
            masks[sequence[:i] + '?' + sequence[i + 1:]].append(sequence[i])
        except KeyError:
            masks[sequence[:i] + '?' + sequence[i + 1:]] = [sequence[i], ]

matches = {}
for mask in masks:
    if len(masks[mask]) > 1:
        matches[mask] = masks[mask]

我正在寻找一种更有效的方法。我遇到了 Trie-trees、KD-trees、n-grams 和索引,但我不知道什么是解决这个问题的最佳方法。

【问题讨论】:

  • 您希望允许的最大汉明距离是多少?
  • 没有细节很难回答。我将计算所有序列的汉明 weights,并创建一个字典,该字典将权重作为键,将所有匹配字符串的列表作为值。然后使用参考值的权重,您应该能够轻松找到给定距离的所有单词。
  • 好问题,但可能超出了 SO 的范围:(1) 特定于某些方面的领域(生物信息学),因此您可能想尝试bioinformatics.stackexchange.com 或 biostars.org,以及(2 ) 不提出精确的技术问题(错误、代码的具体优化等)。但是,我可以给您的提示是搜索已经执行此操作的软件,因为它可能已经过优化和测试。此外,这可能会有所帮助:en.wikipedia.org/wiki/Alignment-free_sequence_analysis

标签: python algorithm bioinformatics


【解决方案1】:

一种方法是局部敏感散列

首先,您应该注意,此方法不一定会返回所有对,它会返回所有高概率的对(或大多数对)。

Locality Sensitive Hashing 可以概括为:彼此接近的数据点被映射到相似的哈希值(在同一个桶中的概率很高)。查看此link 了解更多详情。

您的问题可以在数学上重新表述为:

给定N 向量v ∈ R^{24}, N<<5^24 和最大汉明距离d,返回汉明距离最大为d 的对。

解决这个问题的方法是在R^{24} 中随机生成K 平面{P_1,P_2,...,P_K};其中K 是您必须试验的参数。对于每个数据点v,您将定义v 的散列作为元组Hash(v)=(a_1,a_2,...,a_K),其中a_i∈{0,1} 表示v 是在该平面之上还是之下。您可以证明(我将省略证明)如果两个向量之间的汉明距离很小,那么它们的哈希值接近的概率就很高。

因此,对于任何给定的数据点,您只需检查“关闭”哈希箱中的数据点,而不是检查序列中的所有数据点。

请注意,这些都是基于启发式的,需要您试验K 以及您希望从每个哈希中搜索的“接近”程度。随着 K 的增加,您的 bin 数量会随之增加,但相似度的可能性也会增加。

从你所说的来看,看起来你有一个巨大的数据集,所以我想我会把它扔给你考虑。

【讨论】:

    【解决方案2】:

    在这里找到我的解决方案:http://www.cs.princeton.edu/~rs/strings/

    这使用三元搜索树,只需要几分钟和大约 1GB 的内存。我修改了 demo.c 文件以适用于我的用例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2019-12-27
      • 2012-02-13
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多