找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 4354|回复: 5

[已回复] [新手]关于结果文件的保存 .bump

1

主题

5

帖子

5

积分

贫民

积分
5
g666666666 发表于 2016-11-8 13:39:57 | 显示全部楼层 |阅读模式
def save_latent_vectors(self, prefix):
        self.users.dump(prefix + "%sd_users.pickle" % self.latent_d)
        self.items.dump(prefix + "%sd_items.pickle" % self.latent_d)
结果如图
能够改成保存的文件为一行行的十进制吗
QQ截图20161108133908.png
回复

使用道具 举报

50

主题

1057

帖子

1108

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1108

活跃会员热心会员最佳导师默默耕耘突出贡献优秀版主荣誉管理论坛元老

blueelwang 发表于 2016-11-8 19:48:11 | 显示全部楼层
前提, 代码, 都放进来, 交代清楚, 不然没法判断
回复 支持 1 反对 0

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
g666666666  楼主| 发表于 2016-11-8 13:41:12 | 显示全部楼层
谢谢
回复

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
g666666666  楼主| 发表于 2016-11-9 13:07:01 | 显示全部楼层
blueelwang 发表于 2016-11-8 19:48
前提, 代码, 都放进来, 交代清楚, 不然没法判断
  1. import pandas
  2. import pylab
  3. import matplotlib.pyplot as plt
  4. import matplotlib.cm as cm

  5. import numpy
  6. import pickle
  7. import os
  8. class ProbabilisticMatrixFactorization():

  9.     def __init__(self, rating_tuples, latent_d=1):
  10.         self.latent_d = latent_d
  11.         self.learning_rate = .0001
  12.         self.regularization_strength = 0.1
  13.         
  14.         self.ratings = numpy.array(rating_tuples).astype(float)
  15.         self.converged = False

  16.         self.num_users = int(numpy.max(self.ratings[:, 0]) + 1)
  17.         self.num_items = int(numpy.max(self.ratings[:, 1]) + 1)
  18.         
  19.         print (self.num_users, self.num_items, self.latent_d)
  20.         print self.ratings

  21.         self.users = numpy.random.random((self.num_users, self.latent_d))
  22.         self.items = numpy.random.random((self.num_items, self.latent_d))

  23.         self.new_users = numpy.random.random((self.num_users, self.latent_d))
  24.         self.new_items = numpy.random.random((self.num_items, self.latent_d))           


  25.     def likelihood(self, users=None, items=None):
  26.         if users is None:
  27.             users = self.users
  28.         if items is None:
  29.             items = self.items
  30.             
  31.         sq_error = 0
  32.         
  33.         for rating_tuple in self.ratings:
  34.             if len(rating_tuple) == 3:
  35.                 (i, j, rating) = rating_tuple
  36.                 weight = 1
  37.             elif len(rating_tuple) == 4:
  38.                 (i, j, rating, weight) = rating_tuple
  39.             
  40.             r_hat = numpy.sum(users[i] * items[j])

  41.             sq_error += weight * (rating - r_hat)**2

  42.         L2_norm = 0
  43.         for i in range(self.num_users):
  44.             for d in range(self.latent_d):
  45.                 L2_norm += users[i, d]**2

  46.         for i in range(self.num_items):
  47.             for d in range(self.latent_d):
  48.                 L2_norm += items[i, d]**2

  49.         return -sq_error - self.regularization_strength * L2_norm
  50.         
  51.         
  52.     def update(self):

  53.         updates_o = numpy.zeros((self.num_users, self.latent_d))
  54.         updates_d = numpy.zeros((self.num_items, self.latent_d))        

  55.         for rating_tuple in self.ratings:
  56.             if len(rating_tuple) == 3:
  57.                 (i, j, rating) = rating_tuple
  58.                 weight = 1
  59.             elif len(rating_tuple) == 4:
  60.                 (i, j, rating, weight) = rating_tuple
  61.             
  62.             r_hat = numpy.sum(self.users[i] * self.items[j])
  63.             
  64.             for d in range(self.latent_d):
  65.                 updates_o[i, d] += self.items[j, d] * (rating - r_hat) * weight
  66.                 updates_d[j, d] += self.users[i, d] * (rating - r_hat) * weight

  67.         while (not self.converged):
  68.             initial_lik = self.likelihood()

  69.             print "  setting learning rate =", self.learning_rate
  70.             self.try_updates(updates_o, updates_d)

  71.             final_lik = self.likelihood(self.new_users, self.new_items)

  72.             if final_lik > initial_lik:
  73.                 self.apply_updates(updates_o, updates_d)
  74.                 self.learning_rate *= 1.25

  75.                 if final_lik - initial_lik < 10:
  76.                     self.converged = True
  77.                     
  78.                 break
  79.             else:
  80.                 self.learning_rate *= .5
  81.                 self.undo_updates()

  82.             if self.learning_rate < 1e-10:
  83.                 self.converged = True

  84.         return not self.converged
  85.    

  86.     def apply_updates(self, updates_o, updates_d):
  87.         for i in range(self.num_users):
  88.             for d in range(self.latent_d):
  89.                 self.users[i, d] = self.new_users[i, d]

  90.         for i in range(self.num_items):
  91.             for d in range(self.latent_d):
  92.                 self.items[i, d] = self.new_items[i, d]               

  93.    
  94.     def try_updates(self, updates_o, updates_d):        
  95.         alpha = self.learning_rate
  96.         beta = -self.regularization_strength

  97.         for i in range(self.num_users):
  98.             for d in range(self.latent_d):
  99.                 self.new_users[i,d] = self.users[i, d] + \
  100.                                        alpha * (beta * self.users[i, d] + updates_o[i, d])
  101.         for i in range(self.num_items):
  102.             for d in range(self.latent_d):
  103.                 self.new_items[i, d] = self.items[i, d] + \
  104.                                        alpha * (beta * self.items[i, d] + updates_d[i, d])
  105.         

  106.     def undo_updates(self):
  107.         # Don't need to do anything here
  108.         pass


  109.     def print_latent_vectors(self):
  110.         print "Users"
  111.         for i in range(self.num_users):
  112.             print i,
  113.             for d in range(self.latent_d):
  114.                 print self.users[i, d],
  115.             print
  116.             
  117.         print "Items"
  118.         for i in range(self.num_items):
  119.             print i,
  120.             for d in range(self.latent_d):
  121.                 print self.items[i, d],
  122.             print   


  123.     def save_latent_vectors(self, prefix):
  124.         self.users.dump(prefix + "%sd_users.pickle" % self.latent_d)
  125.         self.items.dump(prefix + "%sd_items.pickle" % self.latent_d)
  126.    
  127. """
  128. def fake_ratings(noise=.25):
  129.     u = []
  130.     v = []
  131.     ratings = []
  132.    
  133.     num_users = 100
  134.     num_items = 100
  135.     num_ratings = 30
  136.     latent_dimension = 10
  137.    
  138.     # Generate the latent user and item vectors
  139.     for i in range(num_users):
  140.         u.append(2 * numpy.random.randn(latent_dimension))
  141.     for i in range(num_items):
  142.         v.append(2 * numpy.random.randn(latent_dimension))
  143.         
  144.     # Get num_ratings ratings per user.
  145.     for i in range(num_users):
  146.         items_rated = numpy.random.permutation(num_items)[:num_ratings]

  147.         for jj in range(num_ratings):
  148.             j = items_rated[jj]
  149.             rating = numpy.sum(u[i] * v[j]) + noise * numpy.random.randn()
  150.         
  151.             ratings.append((i, j, rating))  # thanks sunquiang

  152.     return (ratings, u, v)
  153. """

  154. def real_ratings(noise=.25):
  155.     u = []
  156.     v = []
  157.     ratings = []
  158.    
  159.     num_users = 100
  160.     num_items = 100
  161.     latent_dimension = 10
  162.    
  163.     # Generate the latent user and item vectors
  164.     for i in range(num_users):
  165.         u.append(2 * numpy.random.randn(latent_dimension))
  166.     for i in range(num_items):
  167.         v.append(2 * numpy.random.randn(latent_dimension))
  168.         
  169.     # Get ratings per user.
  170.     #pwd=os.getcwd()
  171.     infile = open("C:\Users\kai\Desktop\code\\u.data",'r')
  172.     for line in infile.readlines():
  173.         f = line.rstrip('\r\n').split("\t")
  174.         f = (float(f[0]),float(f[1]),float(f[2]))
  175.         ratings.append(f)

  176.     return (ratings, u, v)


  177. def plot_ratings(ratings):
  178.     xs = []
  179.     ys = []
  180.    
  181.     for i in range(len(ratings)):
  182.         xs.append(ratings[i][1])
  183.         ys.append(ratings[i][2])
  184.    
  185.     pylab.plot(xs, ys, 'bx')
  186.     pylab.show()

  187. """
  188. def plot_latent_vectors(U, V):
  189.     fig = plt.figure()
  190.     ax = fig.add_subplot(121)
  191.     cmap = cm.jet
  192.     ax.imshow(U, cmap=cmap, interpolation='nearest')
  193.     plt.title("Users")
  194.     plt.axis("off")

  195.     ax = fig.add_subplot(122)
  196.     ax.imshow(V, cmap=cmap, interpolation='nearest')
  197.     plt.title("Items")
  198.     plt.axis("off")

  199. def plot_predicted_ratings(U, V):
  200.     r_hats = -5 * numpy.ones((U.shape[0] + U.shape[1] + 1,
  201.                               V.shape[0] + V.shape[1] + 1))

  202.     for i in range(U.shape[0]):
  203.         for j in range(U.shape[1]):
  204.             r_hats[i + V.shape[1] + 1, j] = U[i, j]

  205.     for i in range(V.shape[0]):
  206.         for j in range(V.shape[1]):
  207.             r_hats[j, i + U.shape[1] + 1] = V[i, j]

  208.     for i in range(U.shape[0]):
  209.         for j in range(V.shape[0]):
  210.             r_hats[i + U.shape[1] + 1, j + V.shape[1] + 1] = numpy.dot(U[i], V[j]) / 10

  211.     fig = plt.figure()
  212.     ax = fig.add_subplot(111)
  213.     ax.imshow(r_hats, cmap=cm.gray, interpolation='nearest')
  214.     plt.title("Predicted Ratings")
  215.     plt.axis("off")
  216. """

  217. if __name__ == "__main__":

  218.     #DATASET = 'fake'
  219.     DATASET = 'real'

  220.     #if DATASET == 'fake':
  221.         #(ratings, true_o, true_d) = fake_ratings()
  222.     if DATASET == 'real':
  223.         (ratings, true_o, true_d) = real_ratings()
  224.    

  225.     #plot_ratings(ratings)

  226.     pmf = ProbabilisticMatrixFactorization(ratings, latent_d=5)
  227.    
  228.     liks = []
  229.     while (pmf.update()):
  230.         lik = pmf.likelihood()
  231.         liks.append(lik)
  232.         print "L=", lik
  233.         pass
  234.    
  235.    
  236.     plt.figure()
  237.     plt.plot(liks)
  238.     plt.xlabel("Iteration")
  239.     plt.ylabel("Log Likelihood")

  240.     #plot_latent_vectors(pmf.users, pmf.items)
  241.     #plot_predicted_ratings(pmf.users, pmf.items)
  242.     plt.show()

  243.     pmf.print_latent_vectors()
  244.     pmf.save_latent_vectors("models/")
复制代码
回复 支持 反对

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
g666666666  楼主| 发表于 2016-11-9 13:09:57 | 显示全部楼层

这是概率矩阵分解的算法,问题在152-154行,结果文件保存的格式好像是ASCII,想要十进制的,一行行的数据,谢谢!!!
回复 支持 反对

使用道具 举报

1

主题

5

帖子

5

积分

贫民

积分
5
g666666666  楼主| 发表于 2016-11-9 13:10:36 | 显示全部楼层
blueelwang 发表于 2016-11-8 19:48
前提, 代码, 都放进来, 交代清楚, 不然没法判断

这是概率矩阵分解的算法,问题在152-154行,结果文件保存的格式好像是ASCII,想要十进制的,一行行的数据,谢谢!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表