查找子序列及其组合的序列转换概率

Posted

技术标签:

【中文标题】查找子序列及其组合的序列转换概率【英文标题】:Find probability of sequence conversion for sub sequences and their combinations 【发布时间】:2021-12-26 22:43:49 【问题描述】:

我有这样的数据

sno     Sequence                                conversion 
1       A-B-C-D-E-B-A                                1
2       A-B-C-D                                      0
3       A-B-C-D                                      1
4       D-E-H-I-A                                    0
5       Z                                            0
6       A-Z                                          0
7       F-E-T-H-S-A-T-J-F-E-D-E-S-X-G-N-N-K-L-D      1
8       H-S-A-T-J-F-E                                0

数据包含可以随机开始和结束的序列。在序列的末尾,有一个表示转换的标志。如果序列转换,则为 '1',如果序列不转换,则为 0。我想通过查找每个序列部分或这些单独子序列的组合的转换条件概率来了解序列中的各个部分如何影响转换。 例如,如果在序列中遇到A,则整个序列的转换概率上升2%。 如果在组合中遇到 A-B-C,那么转换的概率会上升 13% 如果遇到Z-A,转化的概率会上升8%。

如何制作这样的表格-

Sno   Sub-sequence    probabilty_of_conversion 
1         A                2%
2         B                1%
3         C                4%
......
4         A-B-C            13%
5.        Z-A              8%

【问题讨论】:

你如何计算这些概率?我的意思是你怎么来的 "A" -> 2 ?你计算每个单词的出现次数?并除以所有单词中的字符数? 2长序列呢?你数对数了吗?所以呢?= 在上面的示例中,每当遇到 A-B-C-D 时,转换的概率是 50%,因为在遇到此数据的两次中,只有一次转换。 你可能想看看itertools module,特别是关于“组合迭代器”的部分,因为如果“ABC”转换你想增加“A”、“AB”的概率、“BC”和“ABC”,如果我正确理解您的问题的话。 没有关于这个问题的bayesian(删除标签)。问题请求代码来计算条件频率,即statistics 说说A,这个在数据sno[1, 2, 3, 4, 6, 7, 8]上找到,而且只在[1, 3, 7]上转换过所以A 的转化概率为 3/7 或 42.86%。这是计算子概率的正确方法吗? 【参考方案1】:

类似这样的:

import pandas as pd


# input data
input_ = [('A-B-C-D-E-B-A', 1), ('A-B-C-D', 0), ('A-B-C-D', 1),
        ('D-E-H-I-A', 0), ('Z', 0), ('A-Z', 0),
        ('F-E-T-H-S-A-T-J-F-E-D-E-S-X-G-N-N-K-L-D', 1),
        ('H-S-A-T-J-F-E', 0)]
input_ = pd.DataFrame(input_, columns=['sequence', 'conversion'])


# generate sub-sequences
def get_sub_sequences(sequence):
    total = len(sequence)
    for i in range(total):
        for j in range(i+1, total+1):
            yield sequence[i:j]

            
# populate sub-sequences
sub_sequences = []
for sequence in data.sequence:
    for sub_sequence in get_sub_sequences(sequence.split('-')):
        sub_sequence = '-'.join(sub_sequence)
        if sub_sequence not in sub_sequences:
            sub_sequences.append(sub_sequence)
sub_sequences = sorted(sub_sequences, key=len)
            

# populate probabilities
probabilities = []
for sub_sequence in sub_sequences:
    values = []
    for row in data.itertuples():
        if sub_sequence in row.sequence:
            values.append(row.conversion)
    probability = round((sum(values) / len(values) * 100))
    probabilities.append(f'probability%')


# output data
output = pd.DataFrame(zip(sub_sequences, probabilities),
                      columns=['sub_squence', 'probability'])
output

预期输出:

【讨论】:

这个答案看起来不错!我有一个快速的问题。这对于大型数据集不是很有效,有什么方法可以使用并行处理来处理数据?

以上是关于查找子序列及其组合的序列转换概率的主要内容,如果未能解决你的问题,请参考以下文章

使用Ensembl查找基因启动子序列

最长公共子序列及其引申问题

子序列最大和

算法——查找:最长连续递增子序列(部分有序)

动态规划+二分查找解决最长递增子序列

牛客OI赛制测试赛1 F子序列(组合数学+容斥)