Как распараллелить простую линейную регрессию с градиентным спуском - используя numpy? - PullRequest
0 голосов
/ 02 октября 2018

У меня проблемы с использованием numpy для распараллеливания этого цикла for ниже (get_new_weights).С моей первой попыткой df_dm в update_weights вес совершенно неверный.Со второй попыткой df_dm мой вес превышает оптимальный.

Примечание. Смещение - это одно число, а вес - это одно число (одна переменная линейная регрессия), а X - это форма (442,1), а y - это форма (442,1).Также обратите внимание, что обновление моего смещения отлично работает в update_weights - это просто обновление веса, с которым у меня возникают проблемы.

# This is the for loop that I am trying to parallelize with numpy:
def get_new_weights(X, y, weight, bias, learning_rate=0.01):
    weight_deriv = 0
    bias_deriv = 0
    total = len(X)
    for i in range(total):
        # -2x(y - (mx + b))
        weight_deriv += -2*X[i] * (y[i] - (weight*X[i] + bias))
        # -2(y - (mx + b))
        bias_deriv += -2*(y[i] - (weight*X[i] + bias))

    weight -= (weight_deriv / total) * learning_rate
    bias -= (bias_deriv / total) * learning_rate
    return weight, bias

# This is my attempt at parallelization
def update_weights(X, y, weight, bias, lr=0.01):
    df_dm = np.average(-2*X * (y-(weight*X+bias))) # this was my first guess
    # df_dm = np.average(np.dot((-X).T, ((weight*X+bias)-y))) # this was my second guess
    df_db = np.average(-2*(y-(weight*X+bias)))
    weight = weight - (lr*df_dm)
    bias = bias - (lr*df_db)
    return weight,bias

Это уравнение, которое я использую для обновления моего веса и смещения: This is the equation for updating my weight and bias

1 Ответ

0 голосов
/ 02 октября 2018

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

df_dm = (1/len(X)) * np.dot((-2*X).T, (y-(weight*X+bias)))

Проблема заключалась в том, чтобы убедиться, что все массивы, полученные в результате промежуточных шагов, имели правильную форму.И - для тех, кто интересуется разницей во времени выполнения между этими двумя функциями: цикл for занимает в 10 раз больше времени.

...