Я делаю очень простую задачу логистической регрессии, но она не сходится. Набор данных является линейно отделимым. Потеря не может сходиться к 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
Я не знаю, что происходит.