yulmen_

Untitled

Apr 24th, 2022
1,266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.71 KB | None | 0 0
  1. def IALS(sp_ratings, alpha=30, iters=10, lamb=0.1, k=10):
  2.     confidence = sp_ratings * alpha
  3.     N_users, N_items = sp_ratings.get_shape()
  4.     X, Y = sp.csr_matrix(np.random.randn(N_users, k)), sp.csr_matrix(np.random.randn(N_items, k))
  5.    
  6.     I = sp.eye(k) * lamb
  7.     X_I, Y_I = sp.eye(N_users), sp.eye(N_items)
  8.    
  9.     for i in tqdm(range(iters)):
  10.  
  11.         Ay = Y.T.dot(Y)
  12.         Ax = X.T.dot(X)
  13.  
  14.         for u in tqdm(range(N_users)):
  15.             u_row = confidence[u,:].toarray()
  16.             p = u_row.copy()
  17.             p[p != 0] = 1.0
  18.  
  19.             Cu = sp.diags(u_row, [0])
  20.             B = Y.T.dot(Cu).dot(Y)
  21.             C = Y.T.dot(Cu + Y_I).dot(p.T)
  22.             X[u] = spsolve(Ay + B + I, C)
  23.  
  24.    
  25.         for i in tqdm(range(N_items)):
  26.             i_row = confidence[:,i].T.toarray()
  27.  
  28.             p = i_row.copy()
  29.             p[p != 0] = 1.0
  30.  
  31.             Ci = sp.diags(i_row, [0]) + X_I
  32.             B = X.T.dot(Ci).dot(X)
  33.             C = X.T.dot(Ci).dot(p.T)
  34.             Y[i] = spsolve(Ax + B + I, C)
  35.  
  36.     return X, Y
  37.  
  38. def topn_recommendation_als(sp_ratings, item_vectors, user_vectors, user_id, N=30):
  39.     user_history = sp_ratings[user_id,:].toarray()
  40.     user_history = user_history.reshape(-1) + 1
  41.     user_history[user_history > 1] = 0
  42.    
  43.     recom = user_vectors[user_id].dot(item_vectors.transpose()).toarray()
  44.     recom = MinMaxScaler().fit_transform(recom.reshape(-1,1))[:,0]
  45.     recommend_vector = user_history * recom
  46.    
  47.     item_idx = np.argsort(recommend_vector)[::-1][:N]
  48.    
  49.     topn = pd.DataFrame(item_idx, columns=['itemid'])    
  50.     topn['id'] = top_to_bottom_order[topn['itemid']]
  51.     topn = pd.merge(topn, all_names, on='id', how='inner')  
  52.     return topn
Advertisement
Add Comment
Please, Sign In to add comment