In [3]:
import numpy as np

In [6]:
def cofiCostFunc(Theta, Y, R, Users, Movies, Features, Lambda):
    '''
    Função de custo, sem regularização, utilizada na Filtragem Colaborativa.
    Retorna o valor de custo J.
    '''
    
    MF = (Movies * Features)
    UF = (Users * Features)
    
    # X_cofi é o Produto Escalar (nm x nf) com Theta
    X_cofi = XTheta[:MF].reshape(Movies,Features)
    
    # Theta_cofi é o Produto Escalar (nu x nf) com Theta
    Theta_cofi = XTheta[MF:].reshape(Users,Features)
    Vetor_XTheta = X_cofi.dot(Theta_cofi.T)
    
    # Multiplica a Matriz (Vetor_XTheta) resultado com a Matriz R 
    Vetor_XTheta = np.multiply(Vetor_XTheta, R)
    
    # Calculando o custo sem regularização
    J = (1/2) * np.sum( np.square(Vetor_XTheta - Y) )
    
    return J

In [7]:
def cofiGradient(Theta, Y, R, Users, Movies, Features, Lambda):
    '''
    Função de Gradiente, sem regularização, utilizada na Filtragem Colaborativa.
    Retorna o valor de custo J.
    '''
    
    MF = (Movies * Features)
    UF = (Users * Features)
    
    # X_cofi é o Produto Escalar (Movies x Features) com Theta
    X_cofi = XTheta[:MF].reshape(Movies,Features)
    
    # Theta_cofi é o Produto Escalar (Users x Features) com Theta
    Theta_cofi = XTheta[MF:].reshape(Users,Features)

    # Junção de X e Theta para obter Matriz XTtheta com shape de Y
    Vetor_XTheta = X_cofi.dot(Theta_cofi.T)
    
    # Multiplica XTtheta por R para remover qualquer componente dos filmes que não foram classificados.
    Vetor_XTheta = np.multiply(Vetor_XTheta, R)
    
    # Removendo Y da Matriz XTtheta pois já possui valor ZERO p/ filmes não classificados.
    Vetor_XTheta = np.subtract(Vetor_XTheta, Y)
    
    # Unificando a Matrix XTtheta com Theta para ter o mesmo shape de X
    X_grad = Vetor_XTheta.dot(Theta_cofi)
    
    # Unificando a Matrix XTtheta com X para ter o mesmo shape de Theta
    Theta_grad = Vetor_XTheta.T.dot(X_cofi)
    
    # Retornando o gradiente sem regularização com X e Theta concatenados num único vetor.
    grad = np.concatenate((X_grad.flatten(), Theta_grad.flatten()))
    return grad