#python #machine-learning #vectorization #logistic-regression
#python #машинное обучение #векторизация #logistic-regression
Вопрос:
Я пытаюсь реализовать регуляризованную логистическую регрессию, используя python для класса coursera ML, но у меня возникают большие проблемы с ее векторизацией. Используя этот репозиторий:
Я перепробовал много разных способов, но так и не получил правильный градиент или стоимость вот моей текущей реализации:
h = utils.sigmoid( np.dot(X, theta) )
J = (-1/m) * ( y.T.dot( np.log(h) ) (1 - y.T).dot( np.log( 1 - h ) ) ) ( lambda_/(2*m) ) * np.sum( np.square(theta[1:]) )
grad = ((1/m) * (h - y).T.dot( X )).T grad_theta_reg
Вот результаты:
Cost : 0.693147
Ожидаемый
cost: 2.534819
Градиенты:
[-0.100000, -0.030000, -0.080000, -0.130000]
Ожидаемые градиенты:
[0.146561, -0.548558, 0.724722, 1.398003]
Любая помощь от кого-то, кто знает, что происходит, была бы высоко оценена.
Ответ №1:
Ниже приведен рабочий фрагмент векторизованной версии логистической регрессии. Вы можете увидеть больше здесь https://github.com/hzitoun/coursera_machine_learning_matlab_python
Главная
theta_t = np.array([[-2], [-1], [1], [2]])
data = np.arange(1, 16).reshape(3, 5).T
X_t = np.c_[np.ones((5,1)), data/10]
y_t = (np.array([[1], [0], [1], [0], [1]]) >= 0.5) * 1
lambda_t = 3
J, grad = lrCostFunction(theta_t, X_t, y_t, lambda_t), lrGradient(theta_t, X_t, y_t, lambda_t, flattenResult=False)
print('nCost: fn', J)
print('Expected cost: 2.534819n')
print('Gradients:n')
print(' f n', grad)
print('Expected gradients:n')
print(' 0.146561n -0.548558n 0.724722n 1.398003n')
lrCostFunction
from sigmoid import sigmoid
import numpy as np
def lrCostFunction(theta, X, y, reg_lambda):
"""LRCOSTFUNCTION Compute cost and gradient for logistic regression with
regularization
J = LRCOSTFUNCTION(theta, X, y, lambda) computes the cost of using
theta as the parameter for regularized logistic regression and the
gradient of the cost w.r.t. to the parameters.
"""
m, n = X.shape #number of training examples
theta = theta.reshape((n,1))
prediction = sigmoid(X.dot(theta))
cost_y_1 = (1 - y) * np.log(1 - prediction)
cost_y_0 = -1 * y * np.log(prediction)
J = (1.0/m) * np.sum(cost_y_0 - cost_y_1) (reg_lambda/(2.0 * m)) * np.sum(np.power(theta[1:], 2))
return J
lrGradient
from sigmoid import sigmoid
import numpy as np
def lrGradient(theta, X,y, reg_lambda, flattenResult=True):
m,n = X.shape
theta = theta.reshape((n,1))
prediction = sigmoid(np.dot(X, theta))
errors = np.subtract(prediction, y)
grad = (1.0/m) * np.dot(X.T, errors)
grad_with_regul = grad[1:] (reg_lambda/m) * theta[1:]
firstRow = grad[0, :].reshape((1,1))
grad = np.r_[firstRow, grad_with_regul]
if flattenResult:
return grad.flatten()
return grad
Надеюсь, это помогло!