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