Стоимостная функция логистики c регрессии выводит NaN для некоторых значений тета - PullRequest
0 голосов
/ 25 апреля 2020

При реализации регрессии logisti c только с библиотекой numpy я написал следующий код для функции стоимости:

#sigmoid function
def sigmoid(z):
  sigma = 1/(1+np.exp(-z))
  return sigma
#cost function
def cost(X,y,theta):
  m = y.shape[0]
  z = X@theta
  h = sigmoid(z)
  J = np.sum((y*np.log(h))+((1-y)*np.log(1-h)))
  J = -J/m
  return J

Theta - массив (3,1), а X - данные обучения формы (м, 3). Первый столбец X это единицы. Для theta = [0,0,0] функция стоимости выводит 0,693, что является правильной стоимостью, но для theta = [1, -1,1] она выводит:

/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log
  """
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: invalid value encountered in multiply
  """
nan

Мой код для градиента спуск:

#gradientdesc function
#alpha is the learning rate, iter is the number of iterations
def gradientDesc(X,y,theta,alpha,iter):
  m = y.shape[0]
  #d represents the derivative term
  d = np.zeros((3,1))
  for iter in range(iter):

    h = sigmoid(X@theta) - y
    temp = h.T.dot(X)

    d = temp.T
    d/=m
    theta = theta - alpha*d

  return theta

Но это не дает правильного значения тэты. Что мне делать?

1 Ответ

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

Значения в X большие? Это может привести к тому, что sigmoid вернет значения, близкие к нулю, которые приведут к предупреждениям, которые вы видите. Посмотрите на эту тему: Деление на ноль в журнале

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

J += C * np.sum(theta**2) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...