1. 程式人生 > >常見推薦演算法Code總結

常見推薦演算法Code總結

  1. #!/usr/bin/env python
  2. import random
  3. '''
  4. items => {'12':'PHP','1203':'Storm','123':'Ubuntu'}
  5. items_pool => [12,32,121,324,532,123,53,1203,429,2932]
  6. user_items => {'1010':[12,1203,123,429]}
  7. '''
  8. def RandomSelectNagativeSample(items):
  9.     ret = dict()
  10.     for i in items.keys():
  11.         ret[i] = 1
  12.     n = 0
  13.     for i in range(0,len(items)*3):
  14.         item = items_pool[random.randint(0,len(items_pool)-1)]
  15.         if item in ret:
  16.             continue
  17.         ret[item] = 0
  18.         n += 1
  19.         if n > len(items):
  20.             break
  21.     return ret
  22. def InitModel(user_items,F):
  23.     P = dict()
  24.     Q = dict()
  25.     for u in user_items.keys():
  26.         if u not in P:
  27.             P[u] = {}
  28.         for f in range(0,F):
  29.             P[u][f] = 1
  30.     items = user_items.values()
  31.     itemLen = len(items[0])
  32.     i = 0
  33.     while i< itemLen:
  34.         ii = items[0][i]
  35.         if ii not in Q:
  36.             Q[ii] = {}
  37.         for f in range(0,F):
  38.             Q[ii][f] = 1
  39.         i += 1
  40.     return [P,Q]
  41. def LatentFactorModel(user_items,F,N,alpha,lambda1):
  42.     [P,Q] = InitModel(user_items,F)
  43.     for setup in range(0,N):
  44.         for user,items in user_items.items():
  45.             samples = RandomSelectNagativeSample(items)
  46.             for item,rui in samples.items():
  47.                 eui = rui - Predict(user,item)
  48.                 for f in range(0,F):
  49.                     P[user][f] += alpha * (eui * Q[item][f] - lambda1 * P[user][f])
  50.                     Q[item][f] += alpha * (eui * P[user][f] - lambda1 * Q[item][f])
  51.         alpha *= 0.9
  52.     return [P,Q]
  53. def Recommend(user,P,Q):
  54.     rank = dict()
  55.     for f,puf in P[user].items():
  56.         for i,pfi in Q[f].items():
  57.             if i not in rank:
  58.                 rank[i] += puf * qfi
  59.     return rank
  60. def PersonalRank(G,alpha,root,maxsetup):
  61.     rank = dict()
  62.     #rank = {x:0 for x in G.keys()}
  63.     rank = rank.fromkeys(G.keys(),0)
  64.     rank[root] = 1
  65.     for k in range(maxsetup):
  66.         tmp = dict()
  67.         #tmp = {x:0 for x in G.keys()}
  68.         tmp = tmp.fromkeys(G.keys(),0)
  69.         for i,ri in G.items():
  70.             for j,wij in ri.items():
  71.                 if j not in tmp:
  72.                     tmp[j] = 0
  73.                 tmp[j] += alpha * rank[i]/(1.0*len(ri))
  74.                 if j == root:
  75.                     tmp[j] += 1 - alpha
  76.         rank = tmp
  77.         print 'iter:' + str(k) + "\t",
  78.         for key,value in rank.items():
  79.             print "%s:%.3f,\t" % (key,value),
  80.         print
  81.     return rank
  82. if __name__ == '__main__':
  83.     G = {'A':{'a':1,'c':1},
  84.      'B':{'a':1,'b':1,'c':1,'d':1},
  85.      'C':{'c':1,'d':1},
  86.      'a':{'A':1,'B':1},
  87.      'b':{'B':1},
  88.      'c':{'A':1,'B':1,'C':1},
  89.      'd':{'B':1,'C':1}}
  90.     PersonalRank(G,0.85,'A',20)
  91. '''
  92. #items_pool = {'12':'PHP','32':'Nginx','121':'Apache','324':'Erlang','532':'Linux','123':'Ubuntu','53':'Java','1203':'Storm','429':'Kafka','2932':'Flume'}
  93. items_pool = [12,32,121,324,532,123,53,1203,429,2932]
  94. items = {'12':'PHP','1203':'Storm','123':'Ubuntu'}
  95. user_items = {'1010':[12,1203,123,429]}
  96. #print RandomSelectNagativeSample(items)
  97. print InitModel(user_items,4)
  98. '''