Как я могу распараллелить вычисление матрицы различий на основе комбинации большого числа людей (~ 30000)? - PullRequest
0 голосов
/ 24 октября 2019

Я хотел бы распараллелить код, который вычисляет матрицу различий на основе отдельных последовательностей. Функция расстояния, которую я использую для вычисления расстояния между двумя людьми, основана на их longuest common substring.

. У меня есть словарь с моими людьми в качестве ключей (цифры, от 1 до 30000 человек) и их последовательностями в качестве значений (списки)размером 8, с 4 модальностями: «Нет», «1», «2» и «> = 3»).

Я перебираю комбинации своих индивидуумов, и в каждой комбинации я вычисляю расстояниемежду двумя соответствующими последовательностями, а затем я обновляю матрицу различий с этим расстоянием.

import pandas as pd
import numpy as np
from itertools import combinations
import random

def lcsubstring_length(seq1, seq2):
    table = {}
    l = 0
    for i, ca in enumerate(seq1, 1):
        for j, cb in enumerate(seq2, 1):
            if ca == cb:
                table[i, j] = table.get((i - 1, j - 1), 0) + 1
                if table[i, j] > l:
                    l = table[i, j]
    return l

# distance function
def get_distance_sequences(seq1, seq2):
    return (len(seq1) + len(seq2) - 2* lcsubstring_length(seq1, seq2))/(len(seq1) + len(seq2))

# Computation of dissimilarity matrix
def compute_dm_sequential(individuals_sequences):
    n_individuals = len(individuals_sequences.keys())
    dissimilarity_matrix = np.zeros((n_individuals, n_individuals ))
    for pat1, pat2 in combinations(individuals_sequences.keys(), 2): # part to parallelize
        print('Individual' + str(pat1) + ' vs Individual ' + str(pat2)) # just so we know where we are in the process
        seq1 = individuals_sequences[pat1]
        seq2 = individuals_sequences[pat2]
        dissimilarity_matrix[pat1-1, pat2-1] = get_distance_sequences(seq1, seq2)
        dissimilarity_matrix[pat2-1, pat1-1] = dissimilarity_matrix[pat1-1, pat2-1] # symmetric
    return pd.DataFrame(dissimilarity_matrix)

# Here are my states :
states = ["None", "1", "2", ">= 3"]
# Little function that generates a random sequence of size 8 from states
def generate_sequence(states, seq_size):
    sequence = []
    for _ in range(seq_size):
        sequence.append(random.choice(states))
    return sequence

# Now I compute the dictionary with 30000 individuals (labelled 1 to 30000) :
individuals_sequences = {}
for i in range(1, 30001):
    individuals_sequences[i] = generate_sequence(states, 8)

# Finally, computation of dissimilarity matrix :
# dm = compute_dm_sequential(individuals_sequences) # too long in sequential

Это представляет почти 500 000 000 сравнений (для 30000 человек) ...

Я бы хотелчтобы сделать что-то похожее на это: Юлия: эффективное распараллеливание вычисления матрицы различий , но это в Юлии. Ребята, вы знаете, как решить эту проблему с помощью Python? (multiprocessing библиотека ..)

Большое спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...