Я использую следующие cost()
и gradient()
регуляризованные функции:
def cost(theta, x, y, lam):
theta = theta.reshape(1, len(theta))
predictions = sigmoid(np.dot(x, np.transpose(theta))).reshape(len(x), 1)
regularization = (lam / (len(x) * 2)) * np.sum(np.square(np.delete(theta, 0, 1)))
complete = -1 * np.dot(np.transpose(y), np.log(predictions)) \
- np.dot(np.transpose(1 - y), np.log(1 - predictions))
return np.sum(complete) / len(x) + regularization
def gradient(theta, x, y, lam):
theta = theta.reshape(1, len(theta))
predictions = sigmoid(np.dot(x, np.transpose(theta))).reshape(len(x), 1)
theta_without_intercept = theta.copy()
theta_without_intercept[0, 0] = 0
assert(theta_without_intercept.shape == theta.shape)
regularization = (lam / len(x)) * np.sum(theta_without_intercept)
return np.sum(np.multiply((predictions - y), x), 0) / len(x) + regularization
С этими функциями и scipy.optimize.fmin_bfgs()
я получаю следующий вывод (что почти правильно):
Starting loss value: 0.69314718056
Warning: Desired error not necessarily achieved due to precision loss.
Current function value: 0.208444
Iterations: 8
Function evaluations: 51
Gradient evaluations: 39
7.53668131651e-08
Trained loss value: 0.208443907192
Формула для регуляризации ниже. Если я прокомментирую регуляризованные входные данные выше scipy.optimize.fmin_bfgs()
работает хорошо и возвращает локальный оптимум правильно.
Есть идеи, почему?
ОБНОВЛЕНИЕ:
После дополнительных комментариев я обновил регуляризацию стоимости и градиента (в коде выше). Но это предупреждение все еще появляется (новые выходы выше). scipy check_grad
функция возвращает следующее значение: 7.53668131651e-08.
ОБНОВЛЕНИЕ 2:
Я использую набор UCI Machine Learning Iris
data. И на основе модели классификации One-vs-All
подготовка первых результатов для Iris-setosa
.