Моя реализация векторизации градиентного спуска не дает мне правильный ответ - PullRequest
0 голосов
/ 10 июня 2019

В настоящее время я работаю над градиентным спуском Эндрю Нга, используя python, но продолжаю давать мне неправильную оптимальную тэту.Я следовал этому листу векторизации для градиентного спуска --- https://medium.com/ml-ai-study-group/vectorized-implementation-of-cost-functions-and-gradient-vectors-linear-regression-and-logistic-31c17bca9181.

Вот мой код:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

def cost_func(X, Y, theta):
    m = len(X)
    H = X.dot(theta)
    J = 1/(2*m) * (H - Y).T.dot(H - Y)
    return J

def gradient_descent(X, Y, alpha=0.01, iterations=1500):
    #initializing theta as a zero vector 
    theta = np.zeros(X.shape[1])
    #initializing the a list of cost function value
    J_list = [cost_func(X, Y, theta)]
    m = len(X)
    while iterations > 0:
        H = X.dot(theta)
        delta = (1/m)*X.T.dot(H - Y)
        theta = theta - alpha * delta
        iterations -= 1
        J_list.append(cost_func(X, Y, theta))
    return theta, J_list

def check_convergence(J_list):
    plt.plot(range(len(J_list)), J_list)
    plt.xlabel('Iterations')
    plt.ylabel('Cost J')
    plt.show()

file_name_1 = 'https://raw.githubusercontent.com/kaleko/CourseraML/master/ex1/data/ex1data1.txt'

df1 = pd.read_csv(file_name_1, header=None)
X = df1.values[:, 0]
Y = df1.values[:, 1]
m = len(X)
X = np.column_stack((np.ones(m), X))

theta_optimal, J_list = gradient_descent(X, Y, 0.01, 1500)
print(theta_optimal)
check_convergence(J_list)

Мой тета-вывод [-3.63029144 1.16636235], что неверно.

Вот мой график функции стоимости. Как видите, он слишком быстро сходится.

Правильный график должен выглядеть следующим образом.

Спасибо.

...