2017-08-06 5 views
1

J'essaie de construire une matrice de transition d'utilisateur de la chaîne de Markov à partir de zéro, mais je suis resté coincé dans les attributions de valeurs de dictionnaire. Ci-dessous, l'exemple de codeNombre de transitions pour les achats de produits utilisateur dans la vente au détail en ligne

## user purchase sequence seperated by '|' at different time intervals 
## lets say in first purchase user bought 3 4 12 23 45 41 25 these products then 4 5 12 17 19 25 46 3 and so on 
user_purchase = '3 4 12 23 45 41 25|4 5 12 17 19 25 46 3|39 12 3 23 50 24 35 13|42 34 17 19 46' 
## I need to find the transition count from first purchase to second and so on 
## e.g 3-1 is 0 , 3-2 is 0 , 3-3 is 0 , 3-4 is 1 
## hence output should be {...,2:[(0,0),(0,0),.....], 3:[(0,1),(0,1),(0,1),(1,1), ...], 4:[...]} its a dictionary of list with tuples 

### lets say its the total no of products ranging from 1 to 50 that user can buy 
prod = range(1,51) 

### initializing a dictionary of list with tuples 
t = (0,0) 
list1= [] 
for _ in range(len(prod)): 
    list1.append(t) 
user_tran = {} 
for p in prod: 
    user_tran[p]= list1 


# def trans_matrix(prod_seq): 
basket_seq = user_purchase.split('|') 
iteration = len(basket_seq) 
for j in range(iteration-1): 
    trans_from = basket_seq[j] 
    trans_to = basket_seq[j+1] 
    tfrom = map(int,trans_from.split(' ')) 
    print tfrom 
    tto = map(int,trans_to.split(' ')) 
    for item in tfrom: 
### problem here is in each iteration the default value for all keys is updated from [(0,0),(0,0),....] to item_list 
     item_list = user_tran[item] ### seems problem here 
     for i in range(len(prod)): 
      if i+1 in tto: 
       temp = item_list[i] 
       x = list(temp) 
       x[0] = x[0] +1 
       x[1] = x[1] +1 
       item_list[i] = tuple(x) 
      else: 
       temp = item_list[i] 
       x = list(temp) 
       x[0] = x[0] 
       x[1] = x[1] + 1 
       item_list[i] = tuple(x) 
     user_tran[item] = item_list ### list updation should only be for item specified as key in user_tran but all keys are updated with same value 

user_tran [3] [1: 5]

Out [38]: [(0, 23), (15, 23), (7, 23) (7, 23)]

sortie désiré

0 de transition de 3 à 1,2 en 3 séquences d'achats à un moment différent et produit trois étant présent dans la première séquence de trois achat. Mais il y a deux transition de 3-3

[(0,3), (0,3), (2,3), ... jusqu'à ce que le produit 50]

+0

Pouvez-vous expliquer plus en quoi consiste votre dictionnaire de liste de tuples? –

+0

ce que j'essaye de faire est, disons qu'il y a 5 produits dans un magasin et l'utilisateur achète 1,3,4 dans la première visite et 3,2,5 dans la prochaine donc la transition de la 1ère visite à la 2ème donnée par une matrice de probabilité . par exemple pour le produit 1 transitions possibles ici sont 1-1,1-2,1-3,1-4,1-5 et transitions réelles 1-3,1-2,1-5 donc sortie dict de la liste des tuples doit ressembler à {1: [(0,1), (1,1), (1,1), (0,1), (1,1)], 2: [...]} voici la liste des tuples premier tuple (0,1) signifie transition de 1-1, 0 implique 1-1 ne se produit pas et 1 transition d'indication du 1er au 2ème achat. –

+0

Le problème ici est le je ne suis pas capable d'attribuer une valeur au dictionnaire sélectivement basé sur la clé chaque fois que j'essaye de mettre à jour la valeur de liste dans le dictionnaire spécifique à une clé toutes les clés sont mises à jour avec les mêmes valeurs. Je ne sais pas Si j'affecte incorrectement le dictionnaire de la liste 'user_tran'. –

Répondre

0

Je l'ai Je n'ai pas trouvé la raison de cela, mais j'ai essayé de l'implémenter en utilisant numpy array sans les tuples et les dictionnaires.

Ma sortie n'est pas la même que votre sortie attendue, mais j'ai fait exactement ce que vous vouliez faire avec le dictionnaire. C'est juste la traduction de la version dictionnaire-liste en version tableau numpy. Peut être cela vous aidera.

import numpy as np 

user_purchase = '3 4 12 23 45 41 25|4 5 12 17 19 25 46 3|39 12 3 23 50 24 35 13|42 34 17 19 46' 
prod = range(0, 50) 
user_tran = np.zeros((50,50,2)) 
basket_seq = user_purchase.split('|') 
iteration = len(basket_seq) 
for j in range(iteration-1): 
    trans_from = basket_seq[j] 
    trans_to = basket_seq[j+1] 
    tfrom = map(int,trans_from.split(' ')) 
    tfrom = [x-1 for x in tfrom] 
    tto = map(int,trans_to.split(' ')) 
    tto = [x - 1 for x in tto] 
    for item in tfrom: 
     item_list = user_tran[item, :, :] 
     for i in range(len(prod)): 
      if i + 1 in tto: 
       temp = item_list[i, :] 
       item_list[i, :] = np.array([temp[0] + 1, temp[1] + 1]) 
      else: 
       temp = item_list[i, :] 
       item_list[i, :] = np.array([temp[0], temp[0] + 1]) 
     user_tran[item, :, :] = item_list 
print user_tran[2, 1:5, :] 

forme user_tran est comme suit: NxMx2 où N est un nombre de clés dans votre version du dictionnaire, M est un certain nombre d'articles dans votre magasin et 2 est au lieu de tuple avec 2 valeurs. Par exemple: pour obtenir 3ème clé dans votre dictionnaire, et de 1 à 4ème articles dans votre liste, vous devez écrire

user_tran[2, 1:5, :] #instead of user_tran[3][1:5] 

parce tableau commence avec 0 index mais pas 1.

et vous obtiendrez 4x2 matrice où 4 est un nombre d'éléments de votre liste et 2 est 2 valeurs de vos tuples.

+0

Merci Batyr! Mais j'essaie de mettre en œuvre en utilisant des structures de données régulières pour le calcul sur une plate-forme distribuée en utilisant étincelle, comme l'ensemble de données réelles a environ 50000 produits et plus de millions d'utilisateurs. Je ne sais pas comment je peux travailler avec des tableaux np dans les fonctions de fermeture. item_list = user_tran [item] Je pense que la référence d'emplacement est passée plutôt que la valeur causant un problème. –