Эндрю Нг курс ML с использованием python: градиентный спуск - PullRequest
1 голос
/ 29 апреля 2020

Я пытался реализовать решения упражнений Эндрю Нга в python и не уверен, почему я не могу заставить работать градиентный спуск должным образом. Это код, который я использовал для градиентного спуска:

def gradientDescent(x, y, theta, alpha, num_iter):
  m=np.size(x,axis=0)
  for i in range(num_iter):
      hyp=np.dot(x,theta)
      theta = theta - (alpha / m) * np.dot(x.T,(np.dot(X, theta) - y))
      return theta
theta=gradientDescent(X, y, [[0],[0]], 0.01, 1500)

Это тета согласно этому коду: array([[0.05839135],[0.6532885 ]])

Необходимые значения: array([[-3.6303],[[1.1664]])

И модель выглядит так: plot

Вот код, который я следовал, который использует октаву:

function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)

m = length(y); % number of training examples
J_history = zeros(num_iters, 1);

for iter = 1:num_iters
    theta=theta-alpha*(1/m)*X'*(X*theta-y)
    J_history(iter) = computeCost(X, y, theta)
end

end

Также, чтобы найти параметры, которые я пытался использовать метод нормального уравнения, и он дал точный результат, что означает, что остальная часть кода в порядке.

1 Ответ

0 голосов
/ 29 апреля 2020

Ваш код выглядит нормально, кроме опечатки в строке 5 (заглавная X должна быть в нижнем регистре x), переменная hyp никогда не используется, и вы должны передать theta как форму (2,), а не (2,1) (то есть как [0,0]).

Я пробовал это на некоторых игрушечных данных, похоже, работает:

theta_true = np.array([-3.6303, 1.1664])

n = 50
X = np.ones((n,2))
X[:,1] = np.linspace(0,5, n)
ytrue = np.dot(X, theta_true)
y = ytrue + np.random.randn(n)

plt.scatter(X[:,1], y, s=100, c='b', alpha=0.4)
plt.plot(X[:,1], ytrue, 'k--')

Scatterplot of toy data

и запустил ваш (очищенный) код градиентного спуска:

def gradientDescent(x, y, theta, alpha, num_iter):
    m = np.size(x,axis=0)
    for i in range(num_iter):
        theta = theta - (alpha / m) * np.dot(x.T,(np.dot(x, theta) - y))
    return theta

theta = gradientDescent(X, y, [0,0], 0.01, 1500)
theta
# array([-3.81920963,  1.22926242])

, который мне кажется достаточно близким.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...