Потеря логистической регрессии не сходится к 0 - PullRequest
0 голосов
/ 27 октября 2019

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

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

import random
import numpy as np
import matplotlib.pyplot as plt

def sigmoid(z):
    """ Sigmoid function """
    s = 1 / (1 + np.exp(-z))
    return s


def cost_function(theta, X, y):

    output = sigmoid(np.dot(X, theta))
    cost = 0
    m_samples = len(y)
    for i in range(m_samples):
        if y[i] == 0:
            cost += -(1 - y[i]) * np.log(1 - output[i])
        elif y[i] == 1:
            cost += -y[i] * np.log(output[i])
    cost /= m_samples
    return cost


def gradient_update(theta, X, y):
    output = sigmoid(np.dot(X, theta))
    grad = np.dot((output - y).T, X)
    grad = grad / m_samples
    return grad


def gradient_descent(theta, X, y, alpha, max_iterations, print_iterations):

    m_samples = len(y)
    iteration = 0
    X_train = X / np.max(X)

    while (iteration < max_iterations):
        iteration += 1


        gradient = gradient_update(theta, X_train, y)
        theta = theta - alpha * gradient
        if iteration % print_iterations == 0 or iteration == 1:
            cost = cost_function(theta, X_train, y)
            print("[ Iteration", iteration, "]", "cost =", cost)
        #print(gradient)

num_features = train_X.shape[1]
initial_theta = np.random.randn(num_features)
max_iter = 200
print_iter = 25
alpha_test = 0.1

learned_theta = gradient_descent(initial_theta, train_X, train_y, alpha_test, max_iter, print_iter)

Я не думаю, что оно сходится так медленно, вместо этого оно должно сходиться очень быстро.

Это результат.

[Итерация 1] стоимость = 0,6321735730663283

[Итерация 25] стоимость = 0,6307985058882454

[Итерация 50] стоимость = 0,6302278288232466

[Итерация 75] стоимость = 0,6300077925064239

[Итерация 100] стоимость = 0,6299228901862299

[Итерация 125] стоимость = 0,6298894960439918

[Итерация 150] стоимость = 0,6298756287152963

[Итерация 175] стоимость = 0,6298691634248297

[Итерация 200] стоимость = 0,6298655267069331

Я не знаю, что происходит.

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