In [1]:
import numpy as np

In [2]:
def sigmoid(x):
    '''
    A função sigmoid
    '''
    g = np.array([x]).flatten()
    s = 1 / (1 + np.exp(-x))
    return s

In [3]:
def costFunctionReg(theta, X, y, alpha): 
    '''
    A versão do GD que acabamos de estudar é denominada *Batch gradienteient Descent*.
    Em cada iteração do algoritmo, todo o conjunto de treinamento é utilizado.

        X = características (features)
        y = alvo (target)
        Lambda = Taxa de regularização
    '''
    
    m = y.size
    h = sigmoid(X.dot(theta))
    Reg = (alpha/(2*m))*np.sum(np.square(theta[1:]))
    J = -1*(1/m)*(np.log(h).T.dot(y)+np.log(1-h).T.dot(1-y)) + Reg 
    
    if np.isnan(J[0]): return(np.inf)
    
    return(J[0])

In [4]:
def gradientReg(theta, X, y, alpha):
    
    m = y.size
    h = sigmoid(X.dot(theta.reshape(-1,1)))
    Reg = (alpha/m)*np.r_[[[0]],theta[1:].reshape(-1,1)]
    grad = (1/m)*X.T.dot(h-y) + Reg
        
    return np.c_[grad]