@adelshin23

Алгоритм градиентного спуска, почему это так, а никак иначе?

def minimize_stochastic(target_fn, gradient_fn, x, y, theta_0, alpha_0=0.01):

    data = list(zip(x, y))
    theta = theta_0                             
    alpha = alpha_0                             
    min_theta, min_value = None, float("inf")   
    iterations_with_no_improvement = 0

    
    while iterations_with_no_improvement < 100:
        value = sum( target_fn(x_i, y_i, theta) for x_i, y_i in data )

        if value < min_value:
            min_theta, min_value = theta, value
            iterations_with_no_improvement = 0
            alpha = alpha_0
        else:
            iterations_with_no_improvement += 1
            alpha *= 0.9
       
        for x_i, y_i in in_random_order(data):
            gradient_i = gradient_fn(x_i, y_i, theta)
            theta = vector_subtract(theta, scalar_multiply(alpha, gradient_i))

    return min_theta


Если в строке data = list(zip(x,y)), не писать list, независимо от входных данным, возвращает входное значение theta, почему?
  • Вопрос задан
  • 79 просмотров
Решения вопроса 1
TheDeadOne
@TheDeadOne
Седой и строгий
Потому, что zip возвращает генератор, а генератор может быть использован только один раз. Соответственно, строка
value = sum( target_fn(x_i, y_i, theta) for x_i, y_i in data )
срабатывает, а цикл for x_i, y_i in in_random_order(data): уже нет. Если же использовать list, то в переменной data окажется не генератор, а данные, которые он генерирует.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы