Как я могу визуализировать этот алгоритм градиентного спуска? - PullRequest
0 голосов
/ 04 апреля 2020

Как я могу визуально отобразить этот алгоритм градиентного спуска (например, график)?

import matplotlib.pyplot as plt

def sigmoid(sop):
    return 1.0 / (1 + numpy.exp(-1 * sop))

def error(predicted, target):
    return numpy.power(predicted - target, 2)

def error_predicted_deriv(predicted, target):
    return 2 * (predicted - target)

def activation_sop_deriv(sop):
    return sigmoid(sop) * (1.0 - sigmoid(sop))

def sop_w_deriv(x):
    return x

def update_w(w, grad, learning_rate):
    return w - learning_rate * grad

x = 0.1
target = 0.3
learning_rate = 0.01
w = numpy.random.rand()
print("Initial W : ", w)

iterations = 10000

for k in range(iterations):
    # Forward Pass
    y = w * x
    predicted = sigmoid(y)
    err = error(predicted, target)

    # Backward Pass
    g1 = error_predicted_deriv(predicted, target)

    g2 = activation_sop_deriv(predicted)

    g3 = sop_w_deriv(x)

    grad = g3 * g2 * g1
    # print(predicted)

    w = update_w(w, grad, learning_rate)

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

Вот что я сделал:

plt.plot(iterations, predicted)
plt.ylabel("Prediction")
plt.xlabel("Iteration Number")
plt.show()

Я попытался выполнить поиск, но ни один из ресурсов, которые я нашел, не применялся к этому конкретному формату градиентного спуска .

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 04 апреля 2020

И iterations, и predicted являются скалярами (т.е. одномерными) в вашем коде, поэтому вы не можете сгенерировать линейный график. Вам нужно будет хранить их значения в двух массивах, чтобы можно было построить их, я привел пример ниже.

K = 10000

iterations = numpy.arange(K)
predicted = numpy.zeros(K)

for k in range(K):

    # Forward Pass
    y = w * x

    predicted[k] = sigmoid(y)

    err = error(predicted[k], target)

    # Backward Pass
    g1 = error_predicted_deriv(predicted[k], target)

    g2 = activation_sop_deriv(predicted[k])

    g3 = sop_w_deriv(x)

    grad = g3 * g2 * g1

    # print(predicted[k])

    w = update_w(w, grad, learning_rate)
...