Skip to content

Instantly share code, notes, and snippets.

@TheSithPadawan
Last active November 13, 2018 17:48
Show Gist options
  • Save TheSithPadawan/3eccae7719224b2d971e75d31bc67d1f to your computer and use it in GitHub Desktop.
Save TheSithPadawan/3eccae7719224b2d971e75d31bc67d1f to your computer and use it in GitHub Desktop.
def train(lam, num_features, rate = 0.1):
iter = 0
P = defaultdict(np.array)
Q = defaultdict(np.array)
# initialize P and Q
for k, v in user_item_rating_train.items():
P[k[0]] = np.random.uniform(size = num_features)
Q[k[1]] = np.random.uniform(size = num_features)
initial_mse = validate(user_item_rating_train, P, Q)
print ("initial mse", initial_mse)
while iter < 1:
# gradient descent
# take gradient of matrix Q
Q_grad = defaultdict(np.array)
for item in items_train:
Q_grad[item] = np.zeros(num_features)
for k, v in user_item_rating_train.items():
# item vector
q = Q[k[1]]
# user vector
p = P[k[0]]
y = -2 * (v - np.dot(q, p))
# compute item gradient
item_grad = np.ones(num_features) * y * p
# update item gradient
Q_grad[k[1]] += item_grad
for item in items_train:
Q_grad[item] += 2 * Q[item]
Q[item] -= Q_grad[item] * rate
# take gradient of matrix P
P_grad = defaultdict(np.array)
for user in users_train:
P_grad[user] = np.zeros(num_features)
for k, v in user_item_rating_train.items():
# item vector
q = Q[k[1]]
# user vector
p = P[k[0]]
y = -2 * (v - np.dot(q, p))
# compute user gradient
user_grad = np.ones(num_features) * y * q
P_grad[k[0]] += user_grad
for user in users_train:
P[user] -= P_grad[user] * rate
iter+=1
print (iter, "mse =", mse)
return P, Q
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment