Градиентный спуск функция стоимости взрыва - PullRequest
0 голосов
/ 19 февраля 2019

Я пишу этот код для линейной регрессии и пытаюсь уменьшить градиент RSS.Функция стоимости, кажется, взлетает до бесконечности в течение 12 итераций.Я знаю, что это не должно произойти.Может быть, я использовал неправильную функцию градиента для RSS (это можно увидеть в функции "grad ()")?

NumberObservations=100
minVal=1
maxVal=20
X = np.random.uniform(minVal,maxVal,(NumberObservations,1))
e = np.random.normal(0, 1, (NumberObservations,1))
Y= 10 + 5*X + e
B = np.array([[0], [0]])
sum_y = sum(Y)
sum_x = sum(X)
sum_xy = sum(np.multiply(X, Y))
sum_x2 = sum(X*X)
alpha = 0.00001
iterations = 15

def cost_fun(X, Y, B):
    b0 = B[0]
    b1 = B[1]
    s = (Y - (b0 + (b1*X)))**2
    rss = sum(s)
    return rss

def grad(X, Y, B):
    print("B = " + str(B))
    b0 = B[0]
    b1 = B[1]
    g0 = -2*(Y - b0 - (b1*X))
    g1 = -2*((X*Y) - (b0*X) - (b1*X**2))
    grad = np.concatenate((g0, g1), axis = 1)
    return grad

def gradient_descent(X, Y, B, alpha, iterations):
    cost_history = [0] * iterations
    m = len(Y)
    x0 = np.array(np.ones(m))
    x0 = x0.reshape((100, 1))
    X1 = np.concatenate((x0, X), axis = 1)
    for iteration in range(iterations):
        h = np.dot(X1, B)
        h = h.reshape((100, 1))
        loss = h - Y
        g = grad(X, Y, B)
        gradient = (np.dot(g.T, loss) / m)
        B = B - alpha * gradient
        cost = cost_fun(X, Y, B)
        cost_history[iteration] = cost
        print("Iteration %d | Cost: %f" % (iteration, cost))
        print("-----------------------------------------------------------------------")
    return B, cost_history

newB, cost_history = gradient_descent(X, Y, B, alpha, iterations)

# New Values of B
print(newB)

Пожалуйста, помогите.

...