Как заставить эти два фрагмента кода работать параллельно - PullRequest
0 голосов
/ 08 июня 2019

Я хотел бы запустить эти две части кода параллельно.Возможно ли это в Python?Как мне изменить код, чтобы приспособиться к этому?

def smo(self, X, y):
    iterations = 0
    n_samples = X.shape[0]
    # Initial coefficients
    alpha = numpy.zeros(n_samples)
    # Initial gradient
    g = numpy.ones(n_samples)
    while True:
        yg = g * y
        # KKT Conditions
        y_pos_ind = (y == 1)
        y_neg_ind = (numpy.ones(n_samples) - y_pos_ind).astype(bool)
        alpha_pos_ind = (alpha >= self.C)
        alpha_neg_ind = (alpha <= 0)

        indices_violating_Bi_1 = y_pos_ind * alpha_pos_ind
        indices_violating_Bi_2 = y_neg_ind * alpha_neg_ind
        indices_violating_Bi = indices_violating_Bi_1 + indices_violating_Bi_2
        yg_i = yg.copy()
        yg_i[indices_violating_Bi] = float('-inf')
        # First of the maximum violating pair
        i = numpy.argmax(yg_i)

        Kik = self.kernel_matrix(X, i)

        indices_violating_Ai_1 = y_pos_ind * alpha_neg_ind
        indices_violating_Ai_2 = y_neg_ind * alpha_pos_ind
        indices_violating_Ai = indices_violating_Ai_1 + indices_violating_Ai_2
        yg_j = yg.copy()
        yg_j[indices_violating_Ai] = float('+inf')
        # Second of the maximum violating pair
        j = numpy.argmin(yg_j)

        Kjk = self.kernel_matrix(X, j)

        # Optimality criterion
        if(yg_i[i] - yg_j[j]) < self.tol or (iterations >= self.max_iter):
            break

        min_term_1 = (y[i] == 1) * self.C - y[i] * alpha[i]
        min_term_2 = y[j] * alpha[j] + (y[j] == -1) * self.C
        min_term_3 = (yg_i[i] - yg_j[j]) / (Kik[i] + Kjk[j] - 2 * Kik[j])

        # Direction search
        lamda = numpy.min([min_term_1, min_term_2, min_term_3])
        # Gradient update
        g += lamda * y * (Kjk - Kik)
        # Update coefficients
        alpha[i] = alpha[i] + y[i] * lamda
        alpha[j] = alpha[j] - y[j] * lamda

        iterations += 1

    print('{} iterations to arrive at the minimum'.format(iterations))
    return alpha

Я хотел бы запустить эту строку

Kik = self.kernel_matrix (X, i)

и эта строка

Kjk = self.kernel_matrix (X, j)

параллельно.Как мне изменить код, чтобы приспособиться к этому?

1 Ответ

0 голосов
/ 08 июня 2019

Предоставление вам ответа только с законченным многопоточным кодом, вероятно, не будет для вас полезным и затруднительно, учитывая, что я не знаю, что делают сами функции, но посмотрите эту ссылку: https://realpython.com/intro-to-python-threading/

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

thread1 = threading.Thread(target=kernel_matrix,args=(X,j))
thread1.start()

Если вы хотите дождаться завершения потока, вызовите thread.join ()

Вам нужно следить за условиями гонки, слишком хорошими здесь: Что такое условие гонки?

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